【问题标题】:Gradle and IntelliJ with mixed Java/Scala project and SDK 1.6Gradle 和 IntelliJ 与混合 Java/Scala 项目和 SDK 1.6
【发布时间】:2014-01-01 09:57:40
【问题描述】:

我开始在一个多语言 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(我们确实有类似的代码)。

现在我创建了一个全新的 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 个错误,但我相信根本原因就是那个。

现在如果我将上面的代码修复如下:

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。

所以我有两个问题: 1. 如何去掉 IntelliJ 中对 JDK 1.7 的任何引用? 2. 如何在不改变代码的情况下完全摆脱第一个错误?我知道这是可能的,因为 Gradle 成功地做到了。

【问题讨论】:

  • 你在 IntelliJ 中设置了哪个 JDK?
  • @PeterNiederwieser JDK 1.6,这是目前唯一安装的。但是,在此之前我曾短暂安装过 JDK 1.7。
  • 听起来您使用了一个外部 Scala 编译器,它还联合编译 Java 代码并使用 JDK 1.7。

标签: java scala intellij-idea gradle jdk6


【解决方案1】:

我傻了!我在没有重新启动 IntelliJ 的情况下卸载了 JDK 7,所以它仍然指向一些 JDK 7 文件夹。这是一次非常奇怪的经历!

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 2011-05-25
    • 2016-02-23
    • 2017-10-03
    • 1970-01-01
    • 2018-09-05
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多