命令行执行mvn test失败,Eclipse运行正常求排查方案
mvn test时TestNG DTD加载失败的问题 从你贴出的错误栈里,核心问题其实非常明确:
TestNG by default disables loading DTD from unsecured Urls. If you need to explicitly load the DTD from a http url, please do so by using the JVM argument [-Dtestng.dtd.http=true]
简单来说,你的testng.xml里引用了HTTP协议的TestNG DTD文件,但TestNG 7+版本默认禁用了从非HTTPS的不安全URL加载DTD。而Eclipse里能正常运行,是因为TestNG插件默认帮你处理了这个限制,或者它的运行环境已经自动带上了允许加载的参数。
下面给你三个可行的解决方案,按推荐程度排序:
方案1:修改testng.xml的DTD引用为HTTPS(最安全)
直接把testng.xml开头的DTD引用从HTTP换成HTTPS,从根源解决问题,不需要额外配置:
<!-- 原来的HTTP引用 --> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <!-- 修改为HTTPS --> <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
这个方案既符合安全规范,也一劳永逸,不需要后续再关注参数问题。
方案2:在Maven Surefire插件中永久配置JVM参数
如果暂时不想修改testng.xml,可以在POM的maven-surefire-plugin里添加参数配置,让Maven执行测试时自动带上允许加载的JVM参数:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M5</version> <configuration> <forkMode>none</forkMode> <suiteXmlFiles> <suiteXmlFile>testng.xml</suiteXmlFile> </suiteXmlFiles> <!-- 新增这行,永久启用HTTP DTD加载权限 --> <argLine>-Dtestng.dtd.http=true</argLine> </configuration> </plugin>
修改后直接执行mvn test就能正常运行,不用每次手动加参数。
方案3:临时执行命令时添加参数
如果只是临时测试,不想修改任何配置,可以在执行Maven命令时手动带上参数:
mvn test -Dtestng.dtd.http=true
补充:为什么Eclipse里没问题?
Eclipse的TestNG插件在运行测试时,默认已经开启了允许从HTTP加载DTD的设置,或者它的运行环境中自动注入了这个JVM参数,所以不会触发这个错误,这就是命令行和IDE环境的差异所在。
内容的提问来源于stack exchange,提问作者Nil

