如何在不先关闭 Intellij IDEA 的情况下使用 SDKMAN 更改 java 版本?

How do you change java version using SDKMAN without needing to close Intellij IDEA first?

提问人:Steve T 提问时间:10/13/2023 最后编辑:Steve T 更新时间:10/21/2023 访问量:126

问:

我的 PC 笔记本电脑上安装了 sdkman。我从事两个独立的项目,其中 P1 使用 Java 11,P2 使用 Java 8。如果我正在处理 P1,但出现了一些事情,我需要处理 P2,我将使用我的 ide (IntelliJ IDEA) 打开 P2。由于 P2 使用 Java 8,我将打开一个终端并使用 sdkman 将我的电脑更改为使用 Java 8。但是,当我尝试这样做时,我收到 2 条错误消息:

user1@ bin $ sdk default java 8.322.06.2-amzn

rm: cannot remove '/c/Users/user1/.sdkman/candidates/java/current/lib/jrt-fs.jar': 
Device or resource busy

ln: failed to create symbolic link 
'/c/Users/user1/.sdkman/candidates/java/current/8.322.06.2-amzn': No such file or 
directory

当我查看“current/”目录时,它看起来“lib/jrt-fs.jar”(从以前的Java 11 JDK内容中遗留下来的)没有被删除,实际上仍然驻留在“current/”中。如果我尝试通过文件系统删除“lib/”,它会告诉我无法删除该文件夹,因为程序正在使用它。我认为 ide 没有释放一个文件句柄,因为当我关闭 ide 时,我可以删除该文件夹,并且我可以使用 sdkman 再次填充“current/”文件夹。

enter image description here

:有没有办法在不关闭 ide 的情况下释放“current/”文件夹中内容的 ide 文件句柄?

警告:当我在谷歌上搜索“设备或资源繁忙”时,我看到提到我可以以某种方式使用 umount 命令,但我不确定这是否是错误的跟踪,或者我是否只需要更多信息:这里

注意:我正在使用 IntelliJ IDEA 的社区版,版本 2022.3.2

编辑:这是项目设置的快照,显示了从文件系统中选择JDK。

enter image description here

Java IntelliJ-idea 文件句柄 sdkman

评论


答:

1赞 Basil Bourque 10/13/2023 #1

里面IntelliJ 与外部 IntelliJ

  • 若要从 IntelliJ 中运行项目,可以通过在 IntelliJ 中配置来指定要使用的 JDK。
  • SDKMAN当前默认设置的JDK!仅适用于在 IntelliJ 之外自行执行的 Java 应用。

不幸的是,在 IntelliJ 中配置要运行应用的 JDK 既复杂又令人困惑,需要您通过各种埋藏面板进行探索。

这些面板包括一些用于 JDK 的面板,以及一些用于语言级别(要面向的 Java 版本)的面板:

  • 文件 |项目结构 |项目设置 |项目 |SDK ...和语言水平。
  • 文件 |项目结构 |项目设置 |项目 |模块 |语言水平。
  • 设置 |构建、执行、部署 |编译器 |Java 编译器 |每个模块的字节码版本。

可能还有其他我现在不记得了。搜索 Stack Overflow 了解更多信息。

如果要在 IntelliJ Ultimate 版本中构建 Web 应用程序,并通过外部应用程序服务器(如 Tomcat、Jetty、Glassfish、OpenLiberty 等)从 IntelliJ 中运行该应用程序,那么还需要在另一个 IntelliJ 面板中指定应使用哪个 JDK 来启动该应用程序服务器。

如果使用 Maven 或 Gradle,您还需要在那里指定语言级别。

评论

0赞 Steve T 10/14/2023
嗨,罗勒,非常感谢您的信息。我注意到我没有办法将 IntelliJ ide 指向内部 JDK。它仅显示在文件系统中的某个位置选择 JDK。您能否指定内部 JDK 的设置位置/方式?请参阅我编辑的问题以获取快照。
1赞 Basil Bourque 10/14/2023
@SteveT 不知道。您不应更改或访问 IntelliJ 中内置的 JDK。始终为项目安装外部 JDK。
1赞 Steve T 10/21/2023 #2

经过一些额外的努力来解决这个问题,结果证明这是一个简单的解决方案。SDKman 将 JDK 存储在以下文件夹中:

C:\Users\yourUserName\.sdkman\candidates\java

When you issue the command

sdk default java 8.322.06.2-amzn

it copies the JDK from the java 8 folder

C:\Users\yourUserName\.sdkman\candidates\java\8.322.06.2-amzn

and pastes it into the current folder.

C:\Users\yourUserName\.sdkman\candidates\java\current

The idea is that you point your pc to the "current/" directory so that when you change java version with SDKman, the pc environment variable never needs to be updated.

But for the ide, instead of pointing it to the "current/" directory, you can point it directly to the JDK folder

C:\Users\yourUserName\.sdkman\candidates\java\8.322.06.2-amzn

You can specify the JDK for each project, P1 and P2, separately. So even if you change java version with SDKman, that only effects the "current/" directory, which the ides are no longer pointing at.

Since I did this, I dont have to change java version if I want to switch working on my java 8 project to working on my java 11 project. And that means I dont have to close my java 8 project to open my java 11 project. I can have them both open at the same time, and switch between them easily.