我正在更新 hybris/SAP-Commerce (2005) 的旧公司实习扩展。它是使用 API 的扩展。
我不知道扩展是多少岁。
但是,在将其应用于 java 11 时,我发现了这样的问题 ( Java 11: import javax.xml.ws.WebFault: "Cannot resolve symbol ws" )。
重新运行命令 ./hybrisserver.sh 后,给定的(只读)“.jar”文件抛出以下异常:
Failed to instantiate [<class from given .jar>]:
Constructor threw exception;
nested exception is java.lang.IllegalAccessError:
class com.sun.org.apache.xml.internal.resolver.Catalog (in unnamed module @0x9a92113) cannot access class jdk.xml.internal.JdkXmlUtils (in module java.xml) because module java.xml does not export jdk.xml.internal to unnamed module @0x9a92113
我认为这可能是 jdk 的问题,所以我尝试了不同的发行版。(我正在使用 sdkman 开发 Manjaro Linux KDE 20.1)
遵循我测试过的发行版:
Vendor | Version | Dist | Identifier
--------------------------------------------------------
AdoptOpenJDK | 11.0.8.j9 | adpt | 11.0.8.j9-adpt
Java.net | 11.0.8 | open | 11.0.8-open
SAP | 11.0.8 | sapmchn | 11.0.8-sapmchn
每个都抛出相同的错误
最佳答案
这不是 JDK 错误。这实际上是您尝试构建的旧代码存在问题。该代码正在使用 JVM 内部包中的一个类。它不应该那样做。它不应该这样做。
直接使用内部包中的类一直是一个坏主意,因为它们可能会在没有任何通知的情况下发生变化。从我记事起,旧的 Java 文档就包含了关于此的警告……只要我记得。
从 Java 9 开始,模块系统将(默认情况下)阻止应用程序代码访问内部 API。这就是你在这里遇到的问题。
有两种方法可以解决这个问题:
--add-opens
java
中的选项命令行打破模块封装以允许访问类。以下应该对不使用模块的代码执行此操作。--add-opens java.xml/jdk.xml.internal=ALL-UNNAMED
警告 :这种方法应该被视为一种短期的解决方法。下一个 Java 版本可能会更改或删除您正在使用的内部 API。关于java - 无法访问类 jdk.xml.internal.JdkXmlUtils,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64209187/