通过Maven命令行设置属性

13

当我使用Maven时,通过命令行设置一些单元测试的属性让我感到困惑。有很多问题(例如不设置MAVEN_OPTS环境变量指定Maven内存参数是否有办法通过命令行向Maven传递jvm参数?如何为Junit单元测试设置JVM参数?)都涉及这个主题,但没有一个能给出我要找的答案。

我想设置属性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

我不太理解这种行为。有人能启示我吗?

2个回答

26

是的,你应该有。

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

注意在argLine内部添加了-D

接下来我们来解释一下为什么要这样做。实际上,argLinemaven-surefire-plugin的一个属性,并且有对应的用户属性argLine。这意味着您可以通过-DargLine直接在命令行上设置此属性。但是,那个属性的值是-Djava.util.logging.config.class=someClass。这正是在POM中直接配置插件时所拥有的内容。

<argLine>-Djava.util.logging.config.class=someClass</argLine>

此外,当您进行调用时

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

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


1

关于配置测试的方法

如果您想向测试中传递配置,请使用例如src/test/resources/myTestConfig.xml中的文件。或者使用Test-ng的增强功能。在集中的构建服务器或那些想要运行/测试您的代码的地方,无法轻松更改配置值,因此您的测试将毫无价值。

Maven的命令行参数推荐用于配置Maven插件、构建环境和Java构建的配置。请尽量少使用功能、配置和插件。否则,您将面临大量问题,并且“随意调整所有内容”对我来说意味着标准化构建毫无意义的Gradle将更加舒适。


这里使用配置文件是否有点大材小用?我只是想设置java.util.logging.config.class属性来控制我的应用程序所依赖的第三方库的日志输出。 - ksl
如果命令行参数是为了“只在您的计算机上使东西工作”,那就去做吧。但是,如果该代码旨在在其他地方运行,则必须提供非常详细的添加命令行选项的说明。即使将此类配置放置在pom中也是不好的。我以前没有解决过这个特定的问题,但是像SLF4J这样的日志记录器可能会解决异构日志记录框架的问题。 - Stig

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