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

标签 java hybris java-11

我正在更新 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 
每个都抛出相同的错误

最佳答案

这不是 JDK 错误。这实际上是您尝试构建的旧代码存在问题。该代码正在使用 JVM 内部包中的一个类。它不应该那样做。它不应该这样做。
直接使用内部包中的类一直是一个坏主意,因为它们可能会在没有任何通知的情况下发生变化。从我记事起,旧的 Java 文档就包含了关于此的警告……只要我记得。
从 Java 9 开始,模块系统将(默认情况下)阻止应用程序代码访问内部 API。这就是你在这里遇到的问题。
有两种方法可以解决这个问题:

  • 更好的方法是修改您尝试编译的代码,使其不再依赖于该类。 (我们无法在没有看到您的代码的情况下提供有关如何执行此操作的建议...)
  • 另一种方法是使用 --add-opens java 中的选项命令行打破模块封装以允许访问类。以下应该对不使用模块的代码执行此操作。
    --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED
    
    警告 :这种方法应该被视为一种短期的解决方法。下一个 Java 版本可能会更改或删除您正在使用的内部 API。
  • 关于java - 无法访问类 jdk.xml.internal.JdkXmlUtils,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64209187/

    相关文章:

    java - 从伪代码(NTRUEncrypt)实现递归

    java - 在项目外部加载图像

    java - 在 Veracode 中使用 slf4j LOGGER 时出现 CRLF 注入(inject)漏洞 (CWE 117)

    content-management-system - Hybris CMS Cockpit - 添加 Javascript

    Java 11 功能流程在方法调用上推断出错误的类型

    java包和接口(interface)

    hybris 人口和转换器概念及其关系

    java - 如何在Hybris中安装ywebfragmentcache?

    android - 在哪里放置 JAXB 依赖项以在 Java 11 上编译 Android 数据绑定(bind)?

    java - Eclipse + m2e + junit5 - 已经可能了吗?