2

ポリグロット 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 が成功しているので、これが可能であることはわかっています。

4

1 に答える 1