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

Car*_*vor 7 java java-11 sap-commerce-cloud

我正在更新 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
Run Code Online (Sandbox Code Playgroud)

我认为可能是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 
Run Code Online (Sandbox Code Playgroud)

每个都抛出相同的错误

Ste*_*n C 9

这不是 JDK 错误,也不是 JVM 安装中的错误。这实际上是您尝试构建的旧代码的问题。该代码使用 JVM 内部包中的类。它不应该这样做。它不应该这样做。

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

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

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

  • 更好的方法是修改您尝试编译的代码,使其不再依赖于该类。(在没有看到您的代码的情况下,我们无法提供有关如何执行此操作的建议......)

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

    --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED
    
    Run Code Online (Sandbox Code Playgroud)

    警告:此方法应被视为短期解决方法。您正在使用的内部 API可能会在下一个 Java 版本中更改或删除。


注意:从 JDK 10 开始,com.sun.org.apache.xml.internal.resolver.CatalogOpenJDK 源代码中不再存在该类。它已被替换为javax.xml.catalog.Catalog. 我的猜测是,您是从依赖项而不是 JDK 获取“内部”版本。