通过 Maven 命令行设置属性

Setting properties via Maven command line

我对使用 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?)涉及此主题,但 none 有我正在寻找的答案。

我想将 属性 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"

然后测试阶段报如下错误,构建失败:

Error: Could not find or load main class java.util.logging.config.class=someClass

如果我 运行 从命令行执行以下操作:

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

然后开始构建报如下错误但是构建和测试都成功了:

Logging configuration class "someClass" failed java.lang.ClassNotFoundException: someClass

我不太理解这种行为。有没有大神能指教一下?

是的,你应该

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

注意 argLine 中添加了 -D

让我们解释一下原因。 argLine is indeed an attribute of the maven-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属性。您正在添加一个系统 属性.

关于您配置测试的方法

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

Maven 的 command-line 参数的推荐用法是用于配置 Maven 插件、构建环境和构建的 Java 配置。 尽可能少地使用特性、配置和插件。否则您将面临大量问题,tweak-all-you-want-A-standardized-build-doesn't-mean-sh*t-for-me-Gradle 会感觉更舒服。