通过 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 会感觉更舒服。
我对使用 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
。这正是您直接使用
<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 会感觉更舒服。