我在 Netbeans IDE 上运行 JSP 和 Servlet 时遇到问题

时间:2021-04-08 19:13:23

标签: java netbeans macos-big-sur

我在 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)

2 个答案:

答案 0 :(得分:1)

在 Java 9 中,引入了 Java 平台模块系统。

这也添加了访问规则。

在您的情况下,模块 java.xml 不会导出 com.sun.org.apache.xerces.internal.impl.dv.util.Base64,但 tomcat 仍会尝试访问它(您使用的 tomcat 版本可能不支持 JPMS)。

您可以尝试以下三种不同的方法:

更新Tomcat

较新版本的 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。