ポリグロット Java/scala プロジェクトで Gradle を使い始めています。Java モジュールは JDK 1.6 を使用してビルドされたレガシー モジュールであるため、ビルド環境で古い JDK を使用することにしました。
これには非常に実用的な根拠があります。次のようなコード:
class X{
private int i;
<T extends X> void aMethod(T t){
int it = t.i;
}
}
JDK 1.6 を使用すると正常にコンパイルされますが、JDK 1.7 では次のエラーで中断します。
error: i has private access in X
このような理由から (残念ながら)、私は JDK 1.6 に固執することにしました (そのようなコードがあります)。
ここで、2 つのモジュールを使用して、まったく新しい Gradle プロジェクトを作成しました (以前は依存関係/ビルド ツールは使用されていませんでした)。
myApp
|---- common (java module)
|---- someService (depends on common)
| |---- service (scala module)
| |---- api (java client)
Java ソースとターゲットの互換性を 1.6 に設定します。gradle でビルドすると、すべて正常に動作します。つまり、ビルドが実行され、jar がエラーなしで (Java と scala の両方で) 正しくビルドされます。
ここで、'idea' プラグインを使用して IntelliJ プロジェクト ファイルを生成しました。IntelliJ はプロジェクトを正しくロードします。IntelliJ (Ctrl + F9) からビルドしようとすると、次のようになります。
Information: Modules "myApp", "someService", "common" were fully rebuilt due to project configuration/dependencies changes
Information: Compilation completed with 4 errors and 44 warnings in 2 sec
Information: 4 errors
Information: 44 warnings
Error: scala: warning: [options] bootstrap class path not set in conjunction with -source 1.6
Error: scala: 1 error
Error: scala: 43 warnings
Warning: scala: Some input files use unchecked or unsafe operations.
Warning: scala: Recompile with -Xlint:unchecked for details.
... (the warnings follow)
error: properties has private access in X
ご覧のとおり、JDK 1.7 エラーが発生し (1.6 でコンパイルしていますが)、ビルドは失敗します。IntelliJ は 4 つのエラーがあると言っていますが、根本的な原因は 1 つだけだと思います。
ここで、上記のコードを次のように修正するとします。
class X{
private int i;
<T extends X> void aMethod(T t){
// SDK 1.7: explicit downcast grants access to base private members
int it = ((X)t).i;
}
}
次のエラーが表示されます。
scala: Error: org.jetbrains.jps.incremental.scala.remote.ServerException
java.lang.InternalError
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:838)
...
at java.lang.ClassLoader.getBootstrapResource(ClassLoader.java:1305)
...
at sbt.classfile.Analyze$$anonfun$apply$8$$anonfun$sbt$classfile$Analyze$$anonfun$$processDependency$1$1.apply$mcV$sp(Analyze.scala:49)
...
at scala.collection.immutable.HashSet$HashSet1.foreach(HashSet.scala:153)
...
at sbt.compiler.AggressiveCompile.compile1(AggressiveCompile.scala:44)
at org.jetbrains.jps.incremental.scala.local.CompilerImpl.compile(CompilerImpl.scala:63)
...
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
at java.lang.reflect.Method.invoke(Method.java:606)
at com.martiansoftware.nailgun.NGSession.run(Unknown Source)
Caused by: java.io.FileNotFoundException: /usr/lib/jvm/java-7-oracle/jre/lib/resources.jar
...
これは、JDK 1.7 をアンインストールして JDK 1.6 をインストールし、IntelliJ パスのどこかでまだ古い JDK を指していることが原因であると考えています。
2 つの質問があります。1. IntelliJ で JDK 1.7 への参照を削除するにはどうすればよいですか? 2.コードを変更せずに最初のエラーを完全に取り除くには? Gradle が成功しているので、これが可能であることはわかっています。