マシンにJava 6および7がインストールされています。 Gradleは1.7(gradle -v
を使用してチェック)を使用します。ただし、Java 1.6と互換性があるようにコードをコンパイルする必要があります。ドキュメントを理解している限り、sourceCompatibility
プロパティを使用してこれを行うことができます(そして、間接的にtargetCompatibility
をデフォルトでsourceCompatibility
に設定します)。
そこで、ビルドファイルに次の行を追加しました(クロージャーではなく、ルートレベルで)。
sourceCompatibility = 1.6
(確かにいくつかのトライアルでtargetCompatibility = 1.6
も追加しましたが、違いはありません)
結果が実際に1.6と互換性があるかどうかを確認するには、cd
をWEB-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を使用します。
ところで:いくつかのサブプロジェクトで使用するプラグインは次のとおりです。Java
、war
、jetty
、gwt
PDATE 3:ビルドスクリプトを変更してJavaプラグインのみを使用し(したがって、いくつかのjarを作成します)、war
、jetty
およびgwt
プラグイン。ただし、allprojects
セクションと一部のサブプロジェクトで設定しているにもかかわらず、すべてのプロジェクトはsourceCompatibility 1.7に設定されています。ビルドスクリプトに残されているのは、いくつかの良識(maven、ファイル、およびその他のサブプロジェクト)の宣言、使用するリポジトリの宣言、他のいくつかのタスク(ビルドタスクが依存しないタスク)の宣言、影響を受けることはありません)および作成されたjarファイルのマニフェストファイルの構成(マニフェストファイルに仕様と実装バージョンとタイトルを追加します)。
そのどれがsourceCompatibility設定にどのように影響するかわかりません。
この動作は、sourceCompatibility
beforeapply plugin: 'Java'
は、allprojects
内で互換性オプションを設定しようとすると発生します。
私の設定では、以下を置き換えることで状況を解決できます。
allprojects {
sourceCompatibility = 1.6
targetCompatibility = 1.6
}
で:
allprojects {
apply plugin: 'Java'
sourceCompatibility = 1.6
targetCompatibility = 1.6
}
他の誰かが別の設定でこれを確認できれば嬉しいです。
これがバグとして報告されるべきかどうかはまだわかりませんが、この解決策は上記の回避策よりも優れていると思います(ただし、これは非常に役立ちました)。
症状は、誰かがproject.sourceCompatibility
を上書きしていることを示しています。しかし、Gradleをカスタマイズするには多くの方法があることを考えると、それが誰であるかを遠くから言うことはできません。
回避策として、タスクレベルでプロパティを設定できます。これが最終的に重要なことです。
tasks.withType(JavaCompile) {
sourceCompatibility = "1.6"
targetCompatibility = "1.6"
}
これをallProjects { ... }
ブロックに追加します。
SourceCompatibilityまたはtargetCompatibilityを使用している場合、build.gradleファイルでcompileJavaタスクを定義する必要があります。 compileJavaタスクがなければ、両方の互換性変数がIntellijで未使用の変数として表示されます。 Gradleバージョン2.10を使用しています。