我在 Apache Netbeans 12.3 JDK 16.0 上运行 JSP 文件时遇到问题,我在 macOS BigSur 上使用的是 tomcat 9.0.45。我不确定实际上是什么问题。你能帮帮我吗。当我运行 servlet 文件时,我收到了这个错误消息。
java.lang.IllegalAccessError: class org.netbeans.modules.tomcat5.deploy.TomcatManagerImpl (in unnamed module @0x19f724b9) cannot access class com.sun.org.apache.xerces.internal.impl.dv.util.Base64 (in module java.xml) because module java.xml does not export com.sun.org.apache.xerces.internal.impl.dv.util to unnamed module @0x19f724b9
at org.netbeans.modules.tomcat5.deploy.TomcatManagerImpl.run(TomcatManagerImpl.java:533)
at org.netbeans.modules.tomcat5.deploy.TomcatManagerImpl.list(TomcatManagerImpl.java:372)
at org.netbeans.modules.tomcat5.deploy.TomcatManager.modules(TomcatManager.java:718)
at org.netbeans.modules.tomcat5.deploy.TomcatManager.getAvailableModules(TomcatManager.java:529)
at org.netbeans.modules.tomcat5.optional.TMIDResolver.lookupTargetModuleID(TMIDResolver.java:56)
at org.netbeans.modules.j2ee.deployment.impl.TargetServer.checkUndeployForSharedReferences(TargetServer.java:349)
at org.netbeans.modules.j2ee.deployment.impl.TargetServer.checkUndeployForSharedReferences(TargetServer.java:322)
at org.netbeans.modules.j2ee.deployment.impl.TargetServer.checkUndeployForSharedReferences(TargetServer.java:319)
at org.netbeans.modules.j2ee.deployment.impl.TargetServer.processLastTargetModules(TargetServer.java:440)
at org.netbeans.modules.j2ee.deployment.impl.TargetServer.init(TargetServer.java:170)
at org.netbeans.modules.j2ee.deployment.impl.TargetServer.deploy(TargetServer.java:605)
at org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment.deploy(Deployment.java:221)
at org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment.deploy(Deployment.java:141)
at org.netbeans.modules.j2ee.ant.Deploy.execute(Deploy.java:86)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at jdk.internal.reflect.GeneratedMethodAccessor59.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99)
at org.apache.tools.ant.Task.perform(Task.java:350)
at org.apache.tools.ant.Target.execute(Target.java:449)
at org.apache.tools.ant.Target.performTasks(Target.java:470)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1391)
at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1254)
at org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:261)
at org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:574)
at org.netbeans.core.execution.RunClassThread.doRun(RunClassThread.java:132)
at org.netbeans.modules.openide.util.GlobalLookup.execute(GlobalLookup.java:45)
at org.openide.util.lookup.Lookups.executeWith(Lookups.java:278)
at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:81)
答案 0 :(得分:1)
在 Java 9 中,引入了 Java 平台模块系统。
这也添加了访问规则。
在您的情况下,模块 java.xml
不会导出 com.sun.org.apache.xerces.internal.impl.dv.util.Base64
,但 tomcat 仍会尝试访问它(您使用的 tomcat 版本可能不支持 JPMS)。
您可以尝试以下三种不同的方法:
较新版本的 tomcat 可能已修复此问题。比如tomcat 10好像支持JPMS。
--add-exports java.xml/com.sun.org.apache.xerces.internal.impl.dv.util=ALL-UNNAMED
添加到 JVM 参数中。启动tomcat时,可以在启动tomcat的命令中添加JVM参数--add-exports java.xml/com.sun.org.apache.xerces.internal.impl.dv.util=ALL-UNNAMED
。由于 tomcat 可能是通过脚本启动的,因此此行为可能由环境变量控制。许多脚本为此使用环境变量JAVA_OPTS
。如果在启动 tomcat 之前将环境变量 JAVA_OPTS
设置为 --add-exports java.xml/com.sun.org.apache.xerces.internal.impl.dv.util=ALL-UNNAMED
(或将其添加到环境变量中),它可能会被拾取。或者,您可以手动将其添加到命令中,或使用由 JVM 自动选取的环境变量(如 JAVA_TOOL_OPTIONS
)。
这会将模块 java.xml 配置为将包导出到所有未命名的模块(包括 tomcat),即使它默认不这样做。
见Java Platform, Standard Edition Oracle JDK 9 Migration Guide
<块引用>如果您需要使用无法访问的内部 API,请使用 --add-exports
运行时选项。您还可以在编译时使用 --add-exports
访问内部 API。
有关 --add-exports
的详细信息,请参阅 the docs。
module-info.java
通过这样做,Java 可以退回到旧的非 JPMS 行为。
答案 1 :(得分:-1)
NetBeans 12.3 不支持 JDK 16,因此不支持您尝试执行的操作。
请参阅 NetBeans 12.3 文档中关于 Deployment Platforms 的部分:
<块引用>Apache NetBeans 12.3 在 JDK LTS 版本 8 和 11 以及 JDK 15,即此 NetBeans 时的当前 JDK 版本 发布。
因此,请尝试将 NetBeans 配置中的 JDK 16 替换为 JDK 15,看看问题是否会消失。如果使用 Java 15 时问题仍然存在,请通过将 JDK 16 堆栈跟踪替换为 JDK 15 堆栈跟踪来更新您的问题。
作为一个相关的问题,既然您提到您使用的是 Big Sur,您可能还想查看 NetBeans 错误报告 NETBEANS-5037 NetBeans dialog windows in Big Sur。这可能与您无关,但 NetBeans 12.3 发布文档中也提到了这一点:
<块引用>当前的 JDK 在 macOS Big Sur 上存在问题,这会导致冻结 在对话框上。这可以通过应用所描述的解决方法来解决 在 NETBEANS-5037。