无法访问类jdk.xml.internal.JdkXmlUtils



我正在为hybris/SAP Commerce(2005(更新一个旧的公司实习生扩展。使用API是一种扩展。

我不知道分机有多旧。

然而,在将其应用于java 11时,我发现了这样的问题(java 11:import javax.xml.ws.WebFault:"无法解析符号ws"(。

在重新运行命令之后/hybrisser.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内部包中的一个类。它不应该那样做。它不应该需要那样做。

直接在内部包中使用类一直是个坏主意,因为它们可能会在没有任何通知的情况下发生更改。旧的Java文档中包含了有关这方面的警告。。。从我记事起。

从Java 9开始,模块系统将(默认情况下(阻止应用程序代码访问内部API。这就是你在这里遇到的。

有两种方法可以解决这个问题:

  • 更好的方法是修改要编译的代码,使其不再依赖于该类。(我们不能提供如何在没有看到您的代码的情况下做到这一点的建议…(

  • 另一种方法是在java命令行中使用--add-opens选项来破坏模块封装,以允许访问类。以下内容应该针对不使用模块的代码执行此操作。

    --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED
    

    警告:此方法应被视为短期解决方案。使用的内部API可以随下一个Java版本而更改或删除


注意:从JDK10开始,com.sun.org.apache.xml.internal.resolver.Catalog类在OpenJDK源代码中不再存在。它已被javax.xml.catalog.Catalog取代。我的猜测是,你得到了";内部";版本,而不是JDK。

如果您使用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>

最新更新