web-dev-qa-db-ja.com

Gradleの「提供」依存関係

私が持っています build.gradleが私の前にあり、いくつかの依存関係がprovidedとして宣言されていますが、 documentation にはこの依存関係のスコープが表示されません。

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.2.4.RELEASE")
    ....

    provided 'backport-util-concurrent:backport-util-concurrent:3.1'
    provided 'org.javolution:javolution:5.5.1@jar
    ....
}

これはプラグインによって提供されますか?もしそうなら、これがどのプラグインに属しているかをどのようにして見つけますか?

Gradleのprovidedruntime依存関係スコープの違いは何ですか?

18
ps-aux

providedスコープとは何ですか?

コードのコンパイルにjarが必要であるが、jarが本番環境ライブラリコレクションに存在するとします。次に、jarをプロジェクトアーカイブと一緒にパッケージ化する必要はありません。この要件をサポートするために、Mavenにはprovidedというスコープがあります。 jarの依存関係をprovidedとして宣言すると、このjarはコンパイル時にクラスパスに存在しますが、プロジェクトアーカイブにはパッケージされません。

providedスコープは、特にWebアプリケーションで非常に役立ちます。たとえば、プロジェクトをコンパイルするには、クラスパスにservlet-api.jarが存在する必要がありますが、servlet-api.jarファイルをwarとパッケージ化するためにこれは必要ありません。 providedスコープを使用すると、この要件を達成できます。

Gradle Javaプラグインには、providedという名前のスコープが定義されていません。また、warまたはAndroidプラグインにはありません。プロジェクトでprovidedスコープを使用する場合は、build.gradleファイルで定義する必要があります。以下は、gradleでprovidedスコープを宣言するためのコードスニペットです。

configurations {
    provided
}

sourceSets {
    main { compileClasspath += configurations.provided }
}

さて、あなたの2番目の質問:

Gradleで提供されている依存関係スコープとランタイム依存関係スコープの違いは何ですか?

この質問に答えるために、私はcompile依存関係を定義します。 compile依存関係は依存関係であり、コードをコンパイルするために必要です。ここで、コードがXという名前のライブラリを使用する場合、Xをコンパイル時の依存関係として宣言する必要があると想像してください。また、Xが別のライブラリYを内部で使用しており、ランタイム依存関係としてYを宣言したとします。

コンパイル中、GradleはXをクラスパスに追加しますが、Yは追加しません。ですから、Yはコンパイルには必要ありません。ただし、本番環境でプロジェクトアーカイブを実行するにはXYの両方が必要であるため、XYの両方をプロジェクトアーカイブにパッケージ化します。一般に、実稼働環境で必要なすべての依存関係は、runtime依存関係として知られています。

Gradleの公式 documentation では、runtime依存関係は「実行時にプロダクションクラスに必要な依存関係です。デフォルトでは、コンパイル時の依存関係。 "。

ここまで読んだことがあれば、providedcompile依存関係であり、runtime依存関係に含めたくない(基本的には) 、プロジェクトアーカイブと一緒にパッケージ化しないでください)。

以下は、providedおよびruntimeスコープの図です。ここで、compileはプロジェクトのコンパイルに必要な依存関係を指し、non-compileはプロジェクトのコンパイルに不要な依存関係を指します。

41

Gradle 2.12以降では、compileOnlyオプションを使用できます。

見る

https://blog.gradle.org/introducing-compile-only-dependencies

5
PaulNUK

さらに明確にするために、最新バージョンでは、Gradle 5.5にはcompileOnly(提供されているものと同じ)およびruntimeOnlyオプションがあります。新しいデフォルトのコンパイルおよび実行時オプションは実装です。

0
gagarwa