Gradle:クラスパスとコンパイルの依存関係の違いは何ですか?


95

私のプロジェクトへの依存関係を追加するとき、私は例えば、私はそれらを与える必要がある接頭辞かわからない午前"classpath"または"compile".

たとえば、以下の依存関係はコンパイル時またはクラスパスである必要がありますか?

また、これは私のアプリケーションbuild.gradleまたはモジュール固有のbuild.gradleにあるべきですか?

現在のbuild.gradle(アプリケーションレベル):

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.hibernate:hibernate-core:5.0.5.Final'
    compile 'mysql:mysql-connector-java:5.1.38'
} 

1
私は上手く理解できていない気がします。classpathは有効な依存関係スコープではありません。
ツナキ2015

おそらく混乱していますが、有効な依存関係のスコープは何ですか?
java123999 2015

このドキュメントを見てみましょう:docs.gradle.org/current/userguide/...を
Tunaki

私が気づいたことの1つは、ここで言及されているように、compileOnly依存関係はに移動するproject.configurations.compileClasspathが、移動しないことproject.configurations.compileです。github.com/ iboyko / gradle
Vytenis Bivainis 2017

回答:


48

あなたが参照compileclasspathていて、dependencies {}ブロック内にいると推測します。その場合、それらは依存関係の構成です。

構成は、単に名前付きの依存関係のセットです。

compile設定は、Javaプラグインによって作成されます。classpath構成は、一般的に見られるbuildSrc {}一つの依存関係を宣言する必要があるブロックbuild.gradle、自身のために(プラグインのため、おそらく)。


おかげで、私のメインのbuild.gradleでは、クラスパスを使用する必要はありませんか?
java123999 2015

@ java123999いいえ、カスタム作成のプラグインを使用しない限り
Eric Wendelin

@EricWendelin「依存関係{}ブロック内」とは、「ビルドスクリプト{依存関係{}}ブロック内」を意味しますか?(わからない、ただ尋ねるだけです。)
PauloMerson18年

2
dependencies {}ブロック内部の両方に宣言することができbuildscript {}、それの外部。内部ではclasspath、ビルドスクリプト自体をコンパイルするために必要な依存関係の構成を使用します。
エリックウェンデリン2018

56

buildscript自体を実行する必要がある場合は、classpathを使用します。

プロジェクトを実行する必要がある場合は、compileを使用してください

buildscript{}ブロックはbuild.gradle自身のためです。

マルチプロジェクトビルドの場合、トップレベルのビルドファイルはルートプロジェクト用であり、特定のビルドファイルはサブプロジェクト(モジュール)用です。

すべてのサブプロジェクト/モジュールに共通の構成オプションを追加できるトップレベルのビルドファイル。

アプリケーションの依存関係をトップレベルのビルドファイルに配置しないでください。それらは個々のモジュールbuild.gradleファイルに属します。


確認するために:ということを意味してい proandroiddev.com/...を 使用する必要があるcompileとありませんかclasspath
WillC 2018年

1
しかし、典型的なAndroidアプリケーションのように、プロジェクトにモジュールが1つしかない場合は、アプリケーションの依存関係を最上位のファイル自体に配置してみませんか?
ハーシャ

18

私が正しく理解していれば、Project.dependenciesスクリプトブロックとスクリプトブロックを混同していることになりますProject.buildscript.dependencies(この質問に到達したときと同じように)。

私が見つけたものでこれに答えようとします。

すでにProject.dependenciesスクリプトブロックに精通しているはずです。このブロックでは、ソースコードに必要な依存関係を宣言します。プロジェクトに必要な依存関係を宣言する方法はいくつかあります。Gradleチュートリアル:依存関係の種類を参照してください。この問題に最も関連する部分についてのみ説明します。

compile 'org.hibernate:hibernate-core:5.0.5.Final'モジュールの依存関係の宣言です。コンパイル構成(現在は実装構成によって非推奨になっています)は、の単なるキーワードです。Implementation only dependencies.依存関係のタイプを説明するキーワードではありません(ここでは、タイプごとに、チュートリアルで定義されている3つのタイプ、つまりモジュールに従います。ファイル、およびプロジェクト。)

Gradleのチュートリアル:ビルドロジックを整理、それは言います:

ビルドスクリプトで外部ライブラリを使用する必要がある場合は、ビルドスクリプト自体でスクリプトのクラスパスに追加できます。これは、buildscript()メソッドを使用して行い、ビルドスクリプトのクラスパスを宣言するクロージャを渡します。

これは、たとえばJavaコンパイルクラスパスを宣言するのと同じ方法です。プロジェクトの依存関係を除き、依存関係タイプで説明されている依存関係タイプのいずれかを使用できます。

ビルドスクリプトのクラスパスを宣言すると、クラスパス上の他のクラスと同じように、ビルドスクリプトのクラスを使用できます。

私は物事が今あなたに明らかになっていることを願っています。

classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"私たちが設定しているclasspath方法をしてcom.android.tools.build:gradle:${Versions.android_gradle_plugin}いるビルドスクリプト自体ではなく、プロジェクト内のソースで使用されているモジュールの依存関係です。

一方、compile 'org.hibernate:hibernate-core:5.0.5.Final'コンパイル構成を使用して、プロジェクトに必要なモジュールの依存関係を宣言しています

TL; DR: 、classpathcompileおよびimplementation異なる状況下での依存関係に対して使用できるすべてのキーワードがあります。前者はビルドスクリプトに依存関係を渡したいときに使用され、後者は宣言したい構成の1つです。


1
いい答えです。さらに、上記でうまく説明されているようにキーワード自体を凝視する必要があるだけでなく、キーワードだけでは完全なコンテキストを定義しないため、要求されているアーティファクトも考慮する必要があります。たとえば、これはコンパイル時にのみ必要であり、実行時には必要ないjarであるため'org.projectlombok:lombok:1.18.4'classpath関連付けはありjavacませんjava。したがって、正しい使用法は、定義されたキーワードとアーティファクトの相互作用です。つまり、事前の知識が必要です。
eigenfield
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.