在使用Maven时,我对通过命令行为某些单元测试设置属性的正确方法感到困惑。有许多问题(例如Specifying Maven memory parameter without setting MAVEN_OPTS environment variable,Is there a way to pass jvm args via command line to maven?,How to set JVM parameters for Junit Unit Tests?)涉及此主题,但没有一个问题我正在寻找答案。
我想将属性java.util.logging.config.class
设置为某个值,但我不想设置MAVEN_OPTS
环境变量。
我可以使用属性
在我的pom文件中配置surefire插件<argLine>-Djava.util.logging.config.class=someClass</argLine>
以便每次运行测试阶段时都会设置它。
但是,如果我从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
我真的不了解这种行为。有人可以开导我吗?
答案 0 :(得分:9)
是的,你应该
mvn package -DargLine="-Djava.util.logging.config.class=someClass"
请注意-D
内添加了argLine
。
让我们来解释原因。 argLine
确实是maven-surefire-plugin
的一个属性,具有相应的用户属性argLine
。这意味着您可以使用-DargLine
直接在命令行上设置此属性。但是,该属性的值为-Djava.util.logging.config.class=someClass
。这正是您使用
<argLine>-Djava.util.logging.config.class=someClass</argLine>
此外,当您致电
时mvn package -Djava.util.logging.config.class=someClass
然后您没有设置argLine
属性。您正在添加系统属性。
答案 1 :(得分:1)
如果要将配置传递给测试,请使用例如src / test / resources / myTestConfig.xml中的文件。或使用Test-ng的增强功能。您的测试对集中构建服务器或那些想要运行/测试代码的人没有任何价值,其中配置值无法(轻松)更改。
Maven的命令行参数的推荐用法是为构建配置Maven插件,构建环境和Java配置。 尽可能使用少量功能,配置和插件。或者你将面临大量的问题,并且调整所有你想要的A标准化构建并不是为了我 - { - 3会觉得更舒服。