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

问题描述

我正在为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>