通过Maven命令行设置属性

我很困惑在使用Maven时通过命令行为某些unit testing设置属性的正确方法。 有很多问题(例如,在没有设置MAVEN_OPTS环境变量的情况下指定Maven内存参数 , 有没有办法通过命令行将jvm args传递给maven?, 如何为Junitunit testing设置JVM参数? )触及这个主题但是没有人能找到我想要的答案。

我想将属性java.util.logging.config.class设置为某个值,但我不想设置MAVEN_OPTS环境变量。

我可以使用属性在我的pom文件中配置surefire插件:

 -Djava.util.logging.config.class=someClass 

这样每次运行测试阶段时都会设置它。

但是,如果我从pom文件中删除该设置并将以下内容添加到命令行:

 mvn package -DargLine="java.util.logging.config.class=someClass" 

然后报告测试阶段中的以下错误并且构建失败:

错误:无法找到或加载主类java.util.logging.config.class = someClass

如果我从命令行运行以下命令:

 mvn package -Djava.util.logging.config.class=someClass 

然后在构建开始时报告以下错误,但构建和测试成功:

记录配置类“someClass”失败java.lang.ClassNotFoundException:someClass

我真的不明白这种行为。 有人可以开导我吗?

是的,你应该有

 mvn package -DargLine="-Djava.util.logging.config.class=someClass" 

注意在argLine添加了-D

我们来解释一下原因。 argLine确实是maven-surefire-plugin一个属性,具有相应的用户属性argLine 。 这意味着您可以使用-DargLine直接在命令行上设置此属性。 但是,该属性的值是-Djava.util.logging.config.class=someClass 。 这正是您在POM中直接配置插件时所拥有的

 -Djava.util.logging.config.class=someClass 

另外,当你打电话

 mvn package -Djava.util.logging.config.class=someClass 

那么你没有设置argLine属性。 您正在添加系统属性。

关于配置测试的方法

如果要将配置传递给测试,请使用src / test / resources / myTestConfig.xml中的文件。 或者使用Test-ng的增强function。 您的测试对集中式构建服务器或想要运行/测试代码的人没有任何价值,其中配置值无法(轻松)更改。

Maven的命令行参数的推荐用法是为构建配置Maven插件,构建环境和Java配置。 尽可能使用少量function,配置和插件。 或者你将面临大量的问题,而且你想要的调整 – 所有你想要的A标准化构建并不意味着让我感觉更舒服。