在Linux上正确设置Java 9作为Intellij IDEA的SDK,由于新的文件夹结构。

29

在你否定我的问题之前,请考虑这些都不是我问题的答案:


在IntelliJ IDEA 2017.2.6中,尝试将JDK9添加为SDK会通过,但由于类路径为空而无法正常工作。复现步骤如下:
  1. 打开“添加新SDK”对话框(进入项目设置>项目>项目SDK>新建>JDK)
  2. 选择JDK9
  3. 虽然通过了,但如果你查看SDK>JDK9类路径是空的,并且由于找不到基类,导致代码出错。见以下图片:
    no classpaths
在IntelliJ IDEA 2017.3 EAP中,你会收到关于找不到JDK类的错误。见以下图片:
  1. 打开“添加新SDK”对话框(进入项目设置>项目>项目SDK>新建>JDK)
  2. 选择JDK9
  3. 应该能够通过,但会产生错误弹窗
    jdk error popup
使用JDK9进行HelloWorld示例的命令行编译效果符合预期。

编辑:发现一个几乎重复的问题:Intellij IDEA 2017.2无法在Linux Mint 18上添加openjk 9关键区别:

  • Linux版本:他们使用的是Mint 18,而我使用的是Debian Stretch。
  • OpenJDK是目前写作时最新的版本,来自仓库:9~b181-4~bpo9+1。尽管是相同的版本,但在我的情况下仍然无法工作。

编辑:另一个可能的重复问题:intellij idea看不到java 9标准类

我没有理解评论中的答案。尝试为JDK设置不同的名称(9和1.9),但它仍然没有显示模块,而类路径保持为空。


可能与Debian Bug和链接线程中的Failed to find JDK / tools.jar部分有关。 - Naman
你使用最新的 EAP 吗?它应该在其中正常工作。 - y.bedrov
它似乎在9~b181-4和IntelliJ IDEA 2017.3.1 (#IU-173.3942.27)上持续存在。 - mszymborski
2个回答

27

目前的debian二进制软件包openjdk-9-jre-headless 9~b181-4包含编译不正确的lib/jrt-fs.jar文件。
idea youtrackubuntu launchpad上分别出现了两个问题。

正如这里所示:

可能原因:
lib/jrt-fs.jar中的类是使用Java 9选项“-source 8” / “target 8”进行编译的。它们应该改用"--release 8"选项进行编译,或者使用Java 8

一个临时解决方法可能是使用来自Oracle JDK的一个替代品替换/usr/lib/jvm/java-9-openjdk-amd64/lib/jrt-fs.jar
您也可以尝试使用建议选项"--release 8"重新编译openjdk-9源代码。

无论如何,我建议在上面的链接上投票以吸引更多开发团队的关注。


我的直觉告诉我,这可能比你意识到的更危险。你实际上是欺骗OpenJDK,让它认为它有一个来自其他地方的JAR文件,这可能会削弱安全性或开发平台的完整性。我的意思是,毕竟,如果你要把Oracle JDK JAR文件放到某个位置,为什么不直接安装Oracle JDK呢? - Makoto
@Makoto 对我来说最重要的是找出问题的原因。除了使用Oracle JDK外,“youtrack.jetbrains.com”也推荐使用这种解决方法。我希望新的Debian包能够解决那些需要openjdk的人们所遇到的问题。 - Kayvan Tehrani
2
哇,这还没修复。 - Gayan Weerakutti

4

目前建议使用Oracle Java而不是OpenJDK。您可以通过WebUpd8的软件源获取。

sudo add-apt-repository ppa:webupd8team/java &&
sudo apt-get update &&
sudo apt-get install oracle-java9-installer

看起来 OpenJDK 不支持这个,所以如果你想使用最新的 Java 版本,现在这是唯一的方法。否则,就按照你已经做过的正确操作进行,一旦问题得到解决,它就会正常工作。


虽然这可能提供了一种替代方案,但并没有解决真正的问题。我本来会坚持将其作为评论,但谁知道如果 OP 最终接受这种解决问题的方式。 - Naman
@nullpointer:我之前在另一个版本的Linux上遇到过这个问题,那是一个Ubuntu变种。最终令人沮丧的是,无法使用OpenJDK 9与IntelliJ。最简单的方法是使用Oracle JDK,因为它实际上可以正常工作。真正的解决方案是“向Jetbrains提交错误报告并查看情况”,因为大部分问题都在Jetbrains这里解决。如果OP想要使用Java 9...这里有一个解决方案。 - Makoto
作为赏金提供者,我无法更改公司可用的Java版本,但我可能可以添加某些内容(文件?),使Idea接受此特定版本的JDK。通常我会自己调查,但现在我正在与Gradle Kotlin DSL作斗争... - mszymborski
@mszymborski:你应该有权在自己的机器上安装所需的软件。如果你不能这样做,你需要与网络管理员联系,确保这是可能的。 - Makoto
@mszymborski:说真的,Oracle Java和OpenJDK基本上是一样的。Oracle Java只提供了一些OpenJDK无法提供的专有二进制文件。就语言和兼容性而言,其他所有方面都是一对一的。我尊重在整个开发过程中拥有一个同质化堆栈的愿望,但实际上,使用Oracle Java并不会损失任何东西。再次强调,既然您想采用另一种解决方法,其破坏风险比这种方法更高,我真的不确定我们是否应该继续交流。 - Makoto
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接