web-dev-qa-db-ja.com

Gradle sourceCompatibilityはサブプロジェクトに影響しません

マシンにJava 6および7がインストールされています。 Gradleは1.7(gradle -vを使用してチェック)を使用します。ただし、Java 1.6と互換性があるようにコードをコンパイルする必要があります。ドキュメントを理解している限り、sourceCompatibilityプロパティを使用してこれを行うことができます(そして、間接的にtargetCompatibilityをデフォルトでsourceCompatibilityに設定します)。

そこで、ビルドファイルに次の行を追加しました(クロージャーではなく、ルートレベルで)。

sourceCompatibility = 1.6

(確かにいくつかのトライアルでtargetCompatibility = 1.6も追加しましたが、違いはありません)

結果が実際に1.6と互換性があるかどうかを確認するには、cdWEB-INF/classesフォルダーに解凍し、最初のjavap -verboseファイルで.classを使用しました。しかし、ターゲットの互換性を設定したかどうか、1.6ではなく1.5を使用したかどうか、または文字列('1.6')として指定したかどうかに関係なく、javapの結果は

minor version: 0
major version: 51

ちなみに、これはJava 1.7バイトコードであることを意味しますが、これは間違っています。

sourceCompatibility-設定が機能しない理由は何ですか?または、javapは互換性をチェックする正しい方法ではありませんか?

PDATE:はい、これは実際にはマルチプロジェクトビルドですが、サブプロジェクトのビルド結果の1つだけをチェックしました。このサブプロジェクトのビルドファイルで、実際に適用されるように上記の変更を加えました。さらに、ルートプロジェクトのビルドファイルに以下を追加しました(@Vidyaも同様に提案しました)。

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

しかし、これも助けにはなりませんでした。

PDATE 2:関連するbuild.gradleファイルのこのスニペットでsourceCompatibilityの設定を確認しました。

compileJava.doFirst {
    println "source compatibility " + sourceCompatibility
}

SourceCompatibilityは1.7に設定されていましたが、1.6に設定しようとしました。最も単純なサブプロジェクトを抽出して独自にビルドすると、sourceCompatibilityが正しく設定され、Java Byteコードは1.6と互換性があります。ただし、このサブプロジェクトでも、マルチプロジェクトビルドで使用する場合、誤ったsourceCompatibilityを使用します。

ところで:いくつかのサブプロジェクトで使用するプラグインは次のとおりです。Javawarjettygwt

PDATE 3:ビルドスクリプトを変更してJavaプラグインのみを使用し(したがって、いくつかのjarを作成します)、warjettyおよびgwtプラグイン。ただし、allprojectsセクションと一部のサブプロジェクトで設定しているにもかかわらず、すべてのプロジェクトはsourceCompatibility 1.7に設定されています。ビルドスクリプトに残されているのは、いくつかの良識(maven、ファイル、およびその他のサブプロジェクト)の宣言、使用するリポジトリの宣言、他のいくつかのタスク(ビルドタスクが依存しないタスク)の宣言、影響を受けることはありません)および作成されたjarファイルのマニフェストファイルの構成(マニフェストファイルに仕様と実装バージョンとタイトルを追加します)。

そのどれがsourceCompatibility設定にどのように影響するかわかりません。

55
Joachim Kurz

この動作は、sourceCompatibilitybeforeapply plugin: 'Java'は、allprojects内で互換性オプションを設定しようとすると発生します。

私の設定では、以下を置き換えることで状況を解決できます。

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

で:

allprojects {
    apply plugin: 'Java'
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

他の誰かが別の設定でこれを確認できれば嬉しいです。

これがバグとして報告されるべきかどうかはまだわかりませんが、この解決策は上記の回避策よりも優れていると思います(ただし、これは非常に役立ちました)。

84
Marwin

症状は、誰かがproject.sourceCompatibilityを上書きしていることを示しています。しかし、Gradleをカスタマイズするには多くの方法があることを考えると、それが誰であるかを遠くから言うことはできません。

回避策として、タスクレベルでプロパティを設定できます。これが最終的に重要なことです。

tasks.withType(JavaCompile) { 
    sourceCompatibility = "1.6"
    targetCompatibility = "1.6" 
}

これをallProjects { ... }ブロックに追加します。

47

SourceCompatibilityまたはtargetCompatibilityを使用している場合、build.gradleファイルでcompileJavaタスクを定義する必要があります。 compileJavaタスクがなければ、両方の互換性変数がIntellijで未使用の変数として表示されます。 Gradleバージョン2.10を使用しています。

1