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

Chr*_*son 6 spring-test java-9 junit5

我认为这个问题与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)
Run Code Online (Sandbox Code Playgroud)

即使我在此类中包含运行时依赖项,例如xerces:xerces 2.4.0,JDK java.xml模块也是首选(我猜).

我正在使用Gradle 4.1.有没有办法限制JDK提供的模块的范围?

Nic*_*lai 4

正如您正确分析的那样,该包org.w3c.dom.ls存在于平台模块java.xml中。同一包中的类路径上的任何类都将被忽略。这称为拆分,并且存在多个修复程序- 以下两个可能会对您有所帮助。

修补java.xml

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

java --patch-module java.xml=xerxes-4.0.0.jar ...
Run Code Online (Sandbox Code Playgroud)

我从未尝试过使用包含某些相同类的 JAR。据我了解,JDK 类将被 Xerxes 类替换,这意味着它们最好是完全二进制兼容的替换。

升级java.xml

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

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

你面临两个问题:

  • 升级模块路径应该仅用于可升级模块(其中 java.xml不是),但我想我已经在某处读到了尚未强制执行的内容(还?) - 没有尝试
  • 您替换java.xml 的工件需要完全二进制兼容更新 - Xerxes 会是这种情况吗?