当前位置: 首页 > 知识库问答 >
问题:

Gradle和IntelliJ,混合Java/Scala项目和SDK 1.6

濮阳和泰
2023-03-14

我和Gradle开始了一个多语言java/scala项目。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构建,一切都很好,即构建运行并且jars正确构建(java和scala),没有任何错误。

现在我使用“想法”插件生成了我的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做得很成功。

共有1个答案

燕琛
2023-03-14

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

 类似资料:
  • 问题内容: 今天,我一直在尝试寻找一个合适的解决方案来建立一个既包含Java代码又包含Scala代码(它们之间具有双向依赖性)的maven项目。 我发现的解决方案通常包括在该阶段调用scala-maven-plugin或maven-scala- plugin,以便它在默认的maven编译器插件之前运行(示例:http : //www.hascode.com/2012/03 /片段混合- 斯卡拉的J

  • 我试图编译一个MavenJava /Scala混合项目,它有一个Scala类,该类依赖于带有lombok注释的Javabean。我尝试将lombok jar文件添加到Scala编译器的引导类路径以及lombok代理中,但是编译器仍然无法找到生成的getters。Scala编译器是否有办法识别Lombok注释?如果没有,什么是好的解决方案? 请注意,我试图避免引入另一个maven项目,只是为了先编译

  • 我有一个用Java编写的gradle项目,想把整个事情变成一个scala项目(仍然是gradle)。要做到这一点,需要采取哪些步骤? 我开始在scala中定义main方法,似乎Intellij不知道我要做什么。 到目前为止我所做的: > 在build.gradle中应用插件:“scala”--> 在build.gradle中编译'org.scala-lang:scala-library:2.10.

  • 我无法在Intellij Ultimate中同步我的新Android Gradle项目。 在“工具”下

  • 我有一个非常基本的java项目。 IntelliJ是否有类似的命令可以转换为Gradle?四处寻找,但似乎并不是这样。

  • 我们是否需要分别安装hadoop和spark,在hadoop home上设置winutils并配置环境变量 我们创建maven项目,并在POM文件上编写所有依赖项。