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

我正在更新 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 

每个都抛出相同的错误

stack overflow cannot access class jdk.xml.internal.JdkXmlUtils
原文答案

答案:

作者头像

这不是JDK错误,也不是JVM安装中的故障。实际上,这是您要构建的旧代码的问题。该代码正在使用JVM内部软件包中的类。它不应该那样做。它不应该 need to 做到这一点。

直接在内部软件包中直接使用类是一个坏主意,因为它们可能会更改而无需任何通知。旧的Java文档包括有关此的警告...只要我记得。

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

有两种解决方法:

*更好的方法是修改您要编译的代码,以便它不再取决于该类。 (我们无法提供有关 how 的建议,而无需看到您的代码...)

*另一种方法是在 --add-opens 中使用 java 选项,以破坏模块封装以允许访问类。以下内容应适用于不使用模块的代码。

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

``` 

**警告**:该方法应视为 `short term work-around` 。您正在使用 `could` 的内部API使用下一个Java版本更改或删除。

注意:从JDK 10开始, 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>

相关问题