我正在更新 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安装中的故障。实际上,这是您要构建的旧代码的问题。该代码正在使用JVM内部软件包中的类。它不应该那样做。它不应该
need to
做到这一点。直接在内部软件包中直接使用类是一个坏主意,因为它们可能会更改而无需任何通知。旧的Java文档包括有关此的警告...只要我记得。
从Java 9开始,模块系统(默认情况下)将防止应用程序代码访问内部API。这就是您遇到的地方。
有两种解决方法:
*更好的方法是修改您要编译的代码,以便它不再取决于该类。 (我们无法提供有关
how
的建议,而无需看到您的代码...)*另一种方法是在
--add-opens
中使用java
选项,以破坏模块封装以允许访问类。以下内容应适用于不使用模块的代码。注意:从JDK 10开始,
com.sun.org.apache.xml.internal.resolver.Catalog
类不再存在于OpenJDK源代码中。它已被javax.xml.catalog.Catalog
取代。我的猜测是,您是从依赖项而不是JDK获得“内部”版本。