JDK 9:使用SpringExtension编译JUnit 5测试会产生java.lang.NoClassDefFoundError: org/w3c/dom/ls/DocumentLS错误

8
我认为这个问题与JDK 9中的模块排除无关(如java.se.ee),而是因为JDK 9在java.xml模块中包含了一个更新版本的org.w3c.dom.ls,该版本没有DocumentLS类。
堆栈跟踪的重要部分是:
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [spring-test/test-container.xml]; nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ls/DocumentLS
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)

即使我在这个类中包含一个运行时依赖项,比如xerces:xerces 2.4.0,JDK的java.xml模块也是首选(我猜)。
我正在使用Gradle 4.1。有没有办法限制JDK提供的模块的范围?
2个回答

4

正如你正确分析的那样,包org.w3c.dom.ls存在于平台模块java.xml中。任何与该包相同的类路径上的类都将被忽略。这就是所谓的拆分包,并且存在几个修复方法,以下两个可能会对您有所帮助。

补丁java.xml

您可以使用--patch-module将Xerxes JAR的类添加到java.xml模块中:

java --patch-module java.xml=xerxes-4.0.0.jar ...

我从未尝试过在包含部分相同类的JAR文件上进行此操作。据我所知,JDK类将被Xerxes类替换,这意味着它们必须是完全二进制兼容的替代品。

升级java.xml

另一个希望是使用升级模块路径替换java.xml

升级模块路径 (--upgrade-module-path) 包含编译定义的模块,旨在用于代替环境中内置的可升级模块 (编译时和运行时)。

你面临两个问题:

  • 升级模块路径只应用于可升级模块(而java.xml不是),但我认为我曾经在某个地方读到过它没有被强制执行(还没有?)- 没有尝试过
  • 你替换java.xml的组件需要是完全二进制兼容的更新 - Xerxes符合这种情况吗?

感谢您提供的见解和文档参考。我现在注意到类缺失故障出现在运行时而不是编译时。为什么编译器不会在编译时报告“拆分包”问题呢?我猜这个DocumentLS类是spring-core的传递运行时依赖项。我宁愿选择在下游解决问题,而不是像黑客一样修改JDK,虽然很有趣,但可能不具备可移植性。 - Christopher Johnson
另外,我尝试获取有关启动器如何使用-Xdiag:resolver选项解析拆分包的更多信息,但IntelliJ不允许我将其作为Gradle VM运行时选项传递... - Christopher Johnson

3
据我所知,DocumentLS来自W3C API 2002年的草案,似乎没有被纳入发布版本。看起来xerces-2.4.0(来自2006年?)包含了它,但更新版本则不包括。因此,在此处可能需要升级到更近期的Xerces。如果Spring确实依赖于DocumentLS,则还需要对其进行更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接