web-dev-qa-db-ja.com

Gradleのすべての出力ディレクトリを分割する

Gradle 4.0が昨日登場し、プロジェクトを更新しました。

現在、次の警告が表示されています。

Gradleは、JVM言語ごとに個別の出力ディレクトリを使用するようになりましたが、このビルドでは、ソースセットのすべてのクラスに対して単一のディレクトリを想定しています。この動作は廃止され、Gradle 5.0で削除される予定です。

言語ごとに個別の出力ディレクトリを使用したいと思います。それを実現するには何を変更する必要がありますか?


私が試したもの:

  • gradle cleanに続いてgradle build
  • ビルドディレクトリを削除してからgradle buildを実行します。
  • gradleとビルドディレクトリを削除してからgradleを実行します

関連GitHub issue


Gradleプラグイン:

  • Java
  • 日食
  • アイディア
  • org.springframework.boot
30
shammancer

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にアクセスする)場合、この警告が表示されます。

解決策1

つかいます

_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_を実行するだけです。

15
gavenkoa

これは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

5
Dordoka Maisu

コマンドライン実行用のクラスパスエントリを作成するために出力クラスディレクトリが使用されたため、私の場合は少し具体的でした。しかし、おそらくこれは誰かを助けるでしょう。

すべての出力ディレクトリを連結することにしました。私が行った変更はフォームでした

sourceSets.integrationTest.output.classesDir

ext {
    classpathSeparator = System.properties['os.name'].toLowerCase().contains('windows')?";":":"
}
...
sourceSets.integrationTest.output.classesDirs.join(classpathSeparator)
0
Tono Wiedermann