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)
每个都抛出相同的错误
这不是 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 获取“内部”版本。
| 归档时间: |
|
| 查看次数: |
22951 次 |
| 最近记录: |