Gradle 4.0が昨日登場し、プロジェクトを更新しました。
現在、次の警告が表示されています。
Gradleは、JVM言語ごとに個別の出力ディレクトリを使用するようになりましたが、このビルドでは、ソースセットのすべてのクラスに対して単一のディレクトリを想定しています。この動作は廃止され、Gradle 5.0で削除される予定です。
言語ごとに個別の出力ディレクトリを使用したいと思います。それを実現するには何を変更する必要がありますか?
私が試したもの:
gradle clean
に続いてgradle build
gradle build
を実行します。gradle
を実行します関連GitHub issue
Gradleプラグイン:
Gradle 4.0では、リモートビルドキャッシュを有効にするために、JVM言語ごとに複数のsourceSet
が導入されています。 Java
プラグインを使用すると、_build/classes/main
_は_build/classes/Java/main
_になり、_build/classes/test
_は_build/classes/Java/test
_などになります。
表示される警告は DefaultSourceSets.Java で定義されています
したがって、プロジェクト内のプラグインまたは_build.gradle
_がDefaultSourceSetOutput.getClassesDir()
を呼び出す(またはclassesDir
にアクセスする)場合、この警告が表示されます。
つかいます
_sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
_
以下に対応します。
_@Override
public boolean isLegacyLayout() {
return classesDir!=null;
}
@Override
public void setClassesDir(File classesDir) {
setClassesDir((Object)classesDir);
}
@Override
public void setClassesDir(Object classesDir) {
this.classesDir = classesDir;
this.classesDirs.setFrom(classesDir);
}
_
SourceSetOutput.Java は、getClassesDir()
が非推奨としてマークされることに注意してください。
したがって、プロジェクト内のすべてのプラグインがGradle 4.0のサポートを取得するまで、回避策に固執し、非推奨の警告を無視する必要があります。
別の問題はテストファイルです。 新しいレイアウトにしたくない場合(_build/classes/main
_ and _build/classes/Java/test
_)テストパスも調整する必要があります。
_sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
sourceSets.test.output.classesDir = new File(buildDir, "classes/test")
_
[〜#〜] update [〜#〜] IDEAのユーザーは、Gradleの場合、IDE_が個別のout
ディレクトリを使用してビルドを開始することに気付くかもしれません。 4.xが検出されます。 IDEAの外部でアプリを実行する場合、これは不可能になりますhot app reloading。追加と再インポートを修正するには:
_subprojects {
apply plugin: 'idea'
// Due to Gradle 4.x changes (separate output directories per JVM language)
// Idea developers refuse to reuse Gradle classpath and use own 'out/' directory.
// Revert to old behavior to allow Spring Devtool to work with using fast Idea compiler.
// https://youtrack.jetbrains.com/issue/IDEA-175172
// Alternatively use native Gradle builds or bootRun.addResources = true
// To use this feature Push Ctrl+Shift+F9 to recompile!
// Be aware that Idea put resources into classes/ directory!!
idea.module.inheritOutputDirs = false
idea.module.outputDir = sourceSets.main.output.classesDir
idea.module.testOutputDir = sourceSets.test.output.classesDir
}
_
IDEAはリソースを_.class
_ファイルと同じディレクトリに置くため、Gradleクラスパスが破損する可能性があることに注意してください。 IDEAビルトインビルドコマンド(Ctrl + Shift + F10など)を使用するモジュールに対して_gradle clean
_を実行するだけです。
これはGradle 4.0で導入された変更によるものです。複数の言語ソースがある場合、個別の出力ディレクトリを使用するようになりました。
古い動作に戻り、警告を取り除くには、これをbuild.gradleに挿入します。
// Change the output directory for the main source set back to the old path sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
リファレンス: https://docs.gradle.org/4.0/release-notes.html#multiple-class-directories-for-a-single-source-set
コマンドライン実行用のクラスパスエントリを作成するために出力クラスディレクトリが使用されたため、私の場合は少し具体的でした。しかし、おそらくこれは誰かを助けるでしょう。
すべての出力ディレクトリを連結することにしました。私が行った変更はフォームでした
sourceSets.integrationTest.output.classesDir
に
ext {
classpathSeparator = System.properties['os.name'].toLowerCase().contains('windows')?";":":"
}
...
sourceSets.integrationTest.output.classesDirs.join(classpathSeparator)