提问人:Steve T 提问时间:10/13/2023 最后编辑:Steve T 更新时间:10/21/2023 访问量:126
如何在不先关闭 Intellij IDEA 的情况下使用 SDKMAN 更改 java 版本?
How do you change java version using SDKMAN without needing to close Intellij IDEA first?
问:
我的 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/”文件夹。
问:有没有办法在不关闭 ide 的情况下释放“current/”文件夹中内容的 ide 文件句柄?
警告:当我在谷歌上搜索“设备或资源繁忙”时,我看到提到我可以以某种方式使用 umount 命令,但我不确定这是否是错误的跟踪,或者我是否只需要更多信息:这里
注意:我正在使用 IntelliJ IDEA 的社区版,版本 2022.3.2
编辑:这是项目设置的快照,显示了从文件系统中选择JDK。
答:
里面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,您还需要在那里指定语言级别。
评论
经过一些额外的努力来解决这个问题,结果证明这是一个简单的解决方案。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.
评论