问题描述
我正在为hybris / SAP-Commerce更新旧的Company-intern扩展名(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
此方法应被视为短期解决方法。您正在使用的内部API 可以在下一个Java版本中更改或删除。
如果你使用 maven 来构建你的项目,你应该添加 JVM 参数:
--add-opens java.xml/jdk.xml.internal=ALL-UNNAMED
例如:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>--add-opens java.xml/jdk.xml.internal=ALL-UNNAMED</argLine>
</configuration>
</plugin>