错误日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
OpenJDK 64-Bit Server VM warning: Archived non-system classes are disabled because the java.system.class.loader property is specified (value = "com.intellij.util.lang.PathClassLoader"). To use archived non-system classes, this property must not be set
Error occurred during initialization of VM
java.lang.NoClassDefFoundError: com/intellij/util/lang/UrlClassLoader
at java.lang.ClassLoader.defineClass1(java.base@18.0.2/Native Method)
at java.lang.ClassLoader.defineClass(java.base@18.0.2/ClassLoader.java:1013)
at java.security.SecureClassLoader.defineClass(java.base@18.0.2/SecureClassLoader.java:150)
at jdk.internal.loader.BuiltinClassLoader.defineClass(java.base@18.0.2/BuiltinClassLoader.java:862)
at jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(java.base@18.0.2/BuiltinClassLoader.java:760)
at jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(java.base@18.0.2/BuiltinClassLoader.java:681)
at jdk.internal.loader.BuiltinClassLoader.loadClass(java.base@18.0.2/BuiltinClassLoader.java:639)
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(java.base@18.0.2/ClassLoaders.java:188)
at java.lang.ClassLoader.loadClass(java.base@18.0.2/ClassLoader.java:521)
at java.lang.Class.forName0(java.base@18.0.2/Native Method)
at java.lang.Class.forName(java.base@18.0.2/Class.java:488)
at java.lang.Class.forName(java.base@18.0.2/Class.java:467)
at java.lang.ClassLoader.initSystemClassLoader(java.base@18.0.2/ClassLoader.java:1986)
at java.lang.System.initPhase3(java.base@18.0.2/System.java:2285)
Caused by: java.lang.ClassNotFoundException: com.intellij.util.lang.UrlClassLoader
at jdk.internal.loader.BuiltinClassLoader.loadClass(java.base@18.0.2/BuiltinClassLoader.java:641)
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(java.base@18.0.2/ClassLoaders.java:188)
at java.lang.ClassLoader.loadClass(java.base@18.0.2/ClassLoader.java:521)
at java.lang.ClassLoader.defineClass1(java.base@18.0.2/Native Method)
at java.lang.ClassLoader.defineClass(java.base@18.0.2/ClassLoader.java:1013)
at java.security.SecureClassLoader.defineClass(java.base@18.0.2/SecureClassLoader.java:150)
at jdk.internal.loader.BuiltinClassLoader.defineClass(java.base@18.0.2/BuiltinClassLoader.java:862)
at jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(java.base@18.0.2/BuiltinClassLoader.java:760)
at jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(java.base@18.0.2/BuiltinClassLoader.java:681)
at jdk.internal.loader.BuiltinClassLoader.loadClass(java.base@18.0.2/BuiltinClassLoader.java:639)
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(java.base@18.0.2/ClassLoaders.java:188)
at java.lang.ClassLoader.loadClass(java.base@18.0.2/ClassLoader.java:521)
at java.lang.Class.forName0(java.base@18.0.2/Native Method)
at java.lang.Class.forName(java.base@18.0.2/Class.java:488)
at java.lang.Class.forName(java.base@18.0.2/Class.java:467)
at java.lang.ClassLoader.initSystemClassLoader(java.base@18.0.2/ClassLoader.java:1986)
at java.lang.System.initPhase3(java.base@18.0.2/System.java:2285)


Process finished with exit code 1

我的 JVM 运行参数

1
/Users/shaolongfei/Library/Java/JavaVirtualMachines/corretto-18.0.2/Contents/Home/bin/java -Xmx512m -Xms256m -ea -Didea.config.path=/Users/shaolongfei/Library/Caches/JetBrains/IntelliJIdea2023.1/plugins-sandbox/config -Didea.system.path=/Users/shaolongfei/Library/Caches/JetBrains/IntelliJIdea2023.1/plugins-sandbox/system -Didea.plugins.path=/Users/shaolongfei/Library/Caches/JetBrains/IntelliJIdea2023.1/plugins-sandbox/plugins -Didea.classpath.index.enabled=false -Djdk.module.illegalAccess.silent=true -Djava.system.class.loader=com.intellij.util.lang.PathClassLoader --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.ref=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/jdk.internal.vm=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.fs=ALL-UNNAMED --add-opens=java.base/sun.security.ssl=ALL-UNNAMED --add-opens=java.base/sun.security.util=ALL-UNNAMED --add-opens=java.desktop/com.apple.eawt=ALL-UNNAMED --add-opens=java.desktop/com.apple.eawt.event=ALL-UNNAMED --add-opens=java.desktop/com.apple.laf=ALL-UNNAMED --add-opens=java.desktop/java.awt=ALL-UNNAMED --add-opens=java.desktop/java.awt.dnd.peer=ALL-UNNAMED --add-opens=java.desktop/java.awt.event=ALL-UNNAMED --add-opens=java.desktop/java.awt.image=ALL-UNNAMED --add-opens=java.desktop/java.awt.peer=ALL-UNNAMED --add-opens=java.desktop/java.awt.font=ALL-UNNAMED --add-opens=java.desktop/javax.swing=ALL-UNNAMED --add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED --add-opens=java.desktop/javax.swing.text.html=ALL-UNNAMED --add-opens=java.desktop/sun.awt.datatransfer=ALL-UNNAMED --add-opens=java.desktop/sun.awt.image=ALL-UNNAMED --add-opens=java.desktop/sun.awt=ALL-UNNAMED --add-opens=java.desktop/sun.font=ALL-UNNAMED --add-opens=java.desktop/sun.java2d=ALL-UNNAMED --add-opens=java.desktop/sun.lwawt=ALL-UNNAMED --add-opens=java.desktop/sun.lwawt.macosx=ALL-UNNAMED --add-opens=java.desktop/sun.swing=ALL-UNNAMED --add-opens=jdk.attach/sun.tools.attach=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-opens=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED --add-opens=jdk.jdi/com.sun.tools.jdi=ALL-UNNAMED -Didea.required.plugins.id=com.jiyuanime.ActivatePowerModeApplicationPlugin -Dapple.laf.useScreenMenuBar=true -Dapple.awt.fileDialogForDirectories=true -Didea.plugin.in.sandbox.mode=true "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=61523:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath "/Applications/IntelliJ IDEA.app/Contents/lib/log4j.jar:/Applications/IntelliJ IDEA.app/Contents/lib/jdom.jar:/Applications/IntelliJ IDEA.app/Contents/lib/trove4j.jar:/Applications/IntelliJ IDEA.app/Contents/lib/openapi.jar:/Applications/IntelliJ IDEA.app/Contents/lib/util.jar:/Applications/IntelliJ IDEA.app/Contents/lib/util_rt.jar:/Applications/IntelliJ IDEA.app/Contents/lib/bootstrap.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea.jar:/Applications/IntelliJ IDEA.app/Contents/lib/3rd-party-rt.jar:/Applications/IntelliJ IDEA.app/Contents/lib/jna.jar" com.intellij.idea.Main

当时是为了开发一个 IDEA 的插件,我是直接以当时最新的 IDEA 为基础开发的,在 2023.1 版本之上,这个版本 IDEA SDK 的 jdk 要求是 17 及以上,运行环境是 mac M1 pro 的芯片,所以下载的是 64 位的 jdk。

我修改 IDEA 的 JVM 运行版本为 open jdk 20 也不行,按 command+shift+a ,搜索 Choose Boot Java Runtime for the IDE 的 action 进行运行就可以修改,这玩意最好还是别改吧,尽量用 jetbrian 的 jdk。

改了之后出现

1
No manual entry for Choose Boot Java Runtime for the IDE;type=a

出现这个之后你就无法再次修改 IDEA 的 JVM 了,你会发现 IDEA 很多功能用不了了,因为修改 IDEA 的 JVM 是非常不推荐的做法,除非出现特殊问题,jetbrain 要求你这么做。

不过我有修复的办法,打开 /Applications/IntelliJ IDEA.app/Contents/bin 这个路径,找到 repair 这个脚本,运行它,根据提示选择 yes 或者 no 就好了,它可以检测出来你的 JVM 进行了修改,问你是否已经进行 reset,选择 yes,然后重启下 IDEA 就好了。

找了很多方式去修改 jvm 运行参数,但是都无法生效,不知道为什么,修改 idea.vmoptions 并不会改变 jvm 的运行参数,报错依旧。

换一种思路,既然报错是由于 -Djava.system.class.loader=”com.intellij.util.lang.PathClassLoader” 参数导致的,我们又改不了,那就顺着它来,修改 IDEA SDK 所使用的 jdk 版本,但是你会发现它是无法选择 IDEA 自带的 jdk 的,非常傻叉!那个路径是灰色的,不让我选,既然这样,我就拷贝出来一份,重命名一下,就可以选了,搞定。拷贝 /Applications/IntelliJ IDEA.app/Contents/jbr 到 /Users/shaolongfei/Library/Java/JavaVirtualMachines/jbr-17 ,然后让 IDEA SDK 依赖它就好了。