63

ランタイム展開(戦争)に含まれていないコンパイル時のみのクラスを指定する方法の簡単なbuild.gradleの例を教えてください。

「ランタイム」は「コンパイル」から継承されているため、Gradle はこれを間違った方法で取得しているようです。コンパイル時に不要なクラスを実行時に必要とする状況は想像できません。ただし、実行時にデプロイしたくないコードをコンパイル時に生成するためにクラスが必要になる状況はたくさんあります。

肥大化した gradle ドキュメントを調べましたが、明確な指示や例が見つかりません。これは、「構成」を定義し、それを CompileJava プラグインのクラスパスとして設定することで実現できるのではないかと思いますが、ドキュメントでは、これを実現する方法について説明が不十分です。

4

11 に答える 11

57

このトピックに関しては、主にここで多くの議論がありましたが、明確な結論はありません。

あなたは正しい道を進んでいます: 現在の最善の解決策は、独自のprovided構成を宣言することです。これには、コンパイルのみの依存関係が含まれ、コンパイル クラスパスに追加されます。

configurations{
  provided
}

dependencies{
  //Add libraries like lombok, findbugs etc
  provided '...'
}

//Include provided for compilation
sourceSets.main.compileClasspath += [configurations.provided]

// optional: if using 'idea' plugin
idea {
  module{
    scopes.PROVIDED.plus += [configurations.provided]
  }
}

// optional: if using 'eclipse' plugin
eclipse {
  classpath {
    plusConfigurations += [configurations.provided]
  }
}

通常、これはうまく機能します。

于 2012-05-02T00:23:24.540 に答える
12

If you use the war plugin, providedCompile should do the trick. However if you need to exclude dependencies from being included in a jar, you'll have to extend the jar task. Below is an example for building a "fat jar" or "uber jar" (a single jar that includes all classes of its dependencies) excluding depndencies marked provided:

configurations {
    provided
    compile.extendsFrom provided
}

dependencies {
    provided "group.artifact:version"
    compile "group.artifact:version"
}

jar {
    dependsOn configurations.runtime
    from {
        (configurations.runtime - configurations.provided).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    } 
}

Credit: http://kennethjorgensen.com/blog/2014/fat-jars-with-excluded-dependencies-in-gradle/

Update:

As of Gradle 2.12 the issue of defining compile only dependencies is finally solved in a simple and natural manner by the new "copmpileOnly" configuration:

dependencies {
    compileOnly 'javax.servlet:servlet-api:2.5'
}
于 2014-09-12T13:54:15.730 に答える
9

私は自分のプロジェクトのセットアップのためにそれを理解しました。私はgradleプラグイン0.9.+とgradle 1.11で実行されているAndroid Studioを使用しています。メインプロジェクトでは、Amazon広告とAmazonアプリ内購入を使用しています。これは、Amazon デバイス メッセージング (ADM) を使用するライブラリ プロジェクトに依存します。

私の主な問題は、「RuntimeException: Stub!」を取得した ADM にありました。エラー。

1.) ライブラリ プロジェクト: Lukas によって提案された「提供された構成」は、彼が述べたように機能しないため、Richards のアプローチを使用しましたが、そのままではうまく機能しませんでした。aar ファイルの ext_libs フォルダーに lib が見つからなかったため、少し変更する必要がありました。Gradle は、最終的な aar ファイルの libs フォルダーにすべてのライブラリをパックしているようです。

android.libraryVariants.all { variant ->
variant.packageLibrary.exclude( 'libs/amazon-device-messaging-1.0.1.jar' )
}

2.) アプリケーションプロジェクト: ここでは、「提供された構成」を使用したアプローチが機能しました。

configurations{
    provided
} 
dependencies {
    compile 'fr.avianey:facebook-android-api:+@aar'
    compile files('ext_libs/amazon-ads-5.3.22.jar')
    compile files('ext_libs/in-app-purchasing-1.0.3.jar' )
    provided files('ext_libs/amazon-device-messaging-1.0.1.jar')
}

android.applicationVariants.all {
    variant -> variant.javaCompile.classpath += configurations.provided
}
于 2014-06-11T08:07:26.900 に答える
6

コンパイル時の依存関係ではないランタイムの依存関係を持つことは非常に一般的です。逆はかなり特殊なケースであり、Gradle で数行の設定が必要です。Gradle フォーラムでを検索することをお勧めしますprovided

あなたが実際に求めているのは、コンパイル クラス パスではなく、buildの依存関係を宣言しているようです。これがどのように行われるかは、目的の機能がどのように呼び出されるかによって異なります (Ant タスク、Gradle タスク/プラグイン、ビルド スクリプトからのアドホック使用)。あなたがやろうとしていることについてより詳細な情報を提供していただければ、より具体的な回答を提供できます。

Gradle ユーザー ガイドの関連情報へのリンクを次に示します。

于 2012-05-02T16:53:14.517 に答える
6

Gradle 2.12 では、compileOnly構成が導入されました。この機能を紹介するブログ投稿は、次の場所にあります。

Gradle の最新機能: 依存関係のみをコンパイルする

1 つの重要な副作用に注意してください。

「compileOnly」構成が追加された結果、「compile」構成は、コンパイル時のすべての依存関係の全体像を表すものではなくなりました。ビルド スクリプトまたはカスタム プラグインでコンパイル クラスパスを参照する必要がある場合は、代わりに適切なソース セットの compileClasspath プロパティを使用する必要があります。

于 2016-03-30T08:28:41.040 に答える
3

彼らはgradle android plugin 0.8.0に「提供された」構成を追加したことがわかりましたが、うまくいきません。提供されたライブラリはコンパイル パスに自動的に追加されますが、最終的な aar/apk にも含まれます。

私にとってうまくいったのは、@ lukas-hanaceck によって提供されたソリューションでしたが、名前を「提供」から他のカスタム名に変更することでした。私の場合、これは私の最終的な Android アプリケーション プロジェクトの依存関係であるライブラリ プロジェクトです。Heresは私のために働いたものの要点です。

configurations {
   providedlibs
}

dependencies {
   providedlibs files('provided/library.jar')
}

libraryVariants.all {
    variant -> variant.javaCompile.classpath += configurations.providedlibs
}

これは完全にコンパイルされ、提供された/library.jar は最終的な apk に含まれていません。私が抱えている唯一の問題は、library.jar の存在を Android スタジオに通知することです。idea プラグインは Android スタジオでは機能しないようです。グラドルをスタジオと同期するための別のカスタムプラグインがあると思います。

于 2014-07-10T21:39:47.760 に答える
2

Android Studio 1.0 では、次のようにします。

android.libraryVariants.all { variant ->
    variant.outputs.each { output ->
        output.packageLibrary.exclude('libs/someLib.jar')
    }
}
于 2014-12-09T07:22:24.177 に答える
0

「provided」は必要ありません。これを追加してみてください。

android.libraryVariants.all { variant ->
    variant.packageLibrary.exclude( 'ext_libs/amazon-device-messaging-1.0.1.jar' )
}

楽しみ!

于 2014-04-24T22:31:43.490 に答える
0

OPは明らかにAndroidの回答を探していませんでしたが、一部の回答はAndroidに固有です。したがって、このページをご覧になることをお勧めします: http://tools.android.com/tech-docs/new-build-system

バージョン 0.9.0 では、提供されたスコープが導入されました。だから、ただ使う

dependencies {
    provided "groupId:artifcatId:version"
}
于 2014-07-03T11:33:45.063 に答える