NetBeans15 Ant项目升级JDK17.0.8遇factory已定义错误
将基于NetBeans 8.1 + JDK 1.8的Ant项目升级到NetBeans 15 + JDK 17.0.8环境时,触发以下错误:
Java Version Found..17.0.8 java.lang.Error: factory already defined at java.base/java.net.URL.setURLStreamHandlerFactory(URL.java:1228)
Operating System = Windows Server 2019 version 10.0 running on amd64 Java; VM; Vendor = 17.0.8; Java HotSpot(TM) 64-Bit Server VM 17.0.8+9-LTS-211; Oracle Corporation Runtime = Java(TM) SE Runtime Environment 17.0.8+9-LTS-211 Java Home = C:\\Program Files\\Java\\jdk-17 System Locale; Encoding = en_US (asgraphicruleside); Cp1252 Boot & Ext. Classpath = Application Classpath = C:\\Program Files\\NetBeans-15\\netbeans\\platform\\lib\\boot.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\lib\\org-openide-modules.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\lib\\org-openide-util-lookup.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\lib\\org-openide-util-ui.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\lib\\org-openide-util.jar Startup Classpath = C:\\Program Files\\NetBeans-15\\netbeans\\platform\\core\\asm-9.3.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\core\\asm-commons-9.3.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\core\\asm-tree-9.3.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\core\\core-base.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\core\\core.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\core\\org-netbeans-libs-asm.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\core\\org-openide-filesystems-compat8.jar;C:\\Program Files\\NetBeans-15\\netbeans\\platform\\core\\org-openide-filesystems.jar;D:\\JAVA_17\\build\\cluster\\core\\locale\\core_asgraphicruleside.jar
run.run:
2023年8月22日 晚上10:57:02 org.netbeans.ProxyURLStreamHandlerFactory register 严重: 无法找到jar协议的原始流处理器 java.lang.reflect.InaccessibleObjectException: 无法使字段 transient java.net.URLStreamHandler java.net.URL.handler 可访问: 模块 java.base 未向未命名模块 @27973e9b "opens java.net" at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) at java.base/java.lang.reflect.Field.setAccessible(Field.java:172) at org.netbeans.ProxyURLStreamHandlerFactory.register(ProxyURLStreamHandlerFactory.java:59) at org.netbeans.JarClassLoader.<clinit>(JarClassLoader.java:117) at org.netbeans.MainImpl.execute(MainImpl.java:153) at org.netbeans.MainImpl.main(MainImpl.java:60) at org.netbeans.Main.main(Main.java:58)
检测到Java版本..17.0.8 java.lang.Error: factory already defined at java.base/java.net.URL.setURLStreamHandlerFactory(URL.java:1228) at org.eclipse.osgi.framework.internal.core.Framework.installURLStreamHandlerFactory(Framework.java:1765) at org.eclipse.osgi.framework.internal.core.Framework.<init>(Framework.java:232) at org.eclipse.osgi.framework.internal.core.EquinoxLauncher.internalInit(EquinoxLauncher.java:67) at org.eclipse.osgi.framework.internal.core.EquinoxLauncher.init(EquinoxLauncher.java:37) at org.eclipse.osgi.launch.Equinox.init(Equinox.java:178) at org.netbeans.modules.netbinox.Netbinox.init(Netbinox.java:63) at org.netbeans.core.netigso.Netigso.prepare(Netigso.java:146) at org.netbeans.NetigsoHandle.turnOn(NetigsoHandle.java:115) at org.netbeans.ModuleManager.enable(ModuleManager.java:1445) at org.netbeans.ModuleManager.enable(ModuleManager.java:1254) at org.netbeans.core.startup.ModuleList.installNew(ModuleList.java:316) at org.netbeans.core.startup.ModuleList.trigger(ModuleList.java:252) at org.netbeans.core.startup.ModuleSystem.restore(ModuleSystem.java:298) at org.netbeans.core.startup.Main.getModuleSystem(Main.java:173) at org.netbeans.core.startup.Main.getModuleSystem(Main.java:142) at org.netbeans.core.startup.Main.start(Main.java:299) at org.netbeans.core.startup.TopThreadGroup.run(TopThreadGroup.java:98) at java.base/java.lang.Thread.run(Thread.java:833) 警告 [org.netbeans.core.modules]: 在com.adminserver.asgraphicrulesidemodule中使用OpenIDE-Module-Class: Loader已过时。
- 在类路径中添加参数:
--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED - 针对JDK17兼容性,更新Spring、Jakarta及Maven版本
- 将NetBeans模块更新至NetBeans15支持的版本
补充JVM参数解决反射访问限制
在现有--add-opens参数基础上,添加--add-opens=java.base/java.net=ALL-UNNAMED和--add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED,解决jar协议流处理器的反射访问问题。禁用重复的URLStreamHandlerFactory注册
添加系统属性-Dorg.netbeans.core.Netigso.disableClassPathUrlHack=true,阻止NetBeans的JarClassLoader与Eclipse OSGi框架重复注册URLStreamHandlerFactory。清理过时模块配置
删除com.adminserver.asgraphicrulesidemodule模块中的OpenIDE-Module-Class: Loader配置,改用NetBeans 15推荐的模块加载方式。升级Ant版本
将Ant升级到1.10.12及以上版本,确保与JDK17完全兼容,同时检查Ant脚本中是否存在手动注册URLStreamHandlerFactory的代码并移除。
内容的提问来源于stack exchange,提问作者AMEER HUSSAIN

