通过 Maven 命令行设置属性

Posted

技术标签:

【中文标题】通过 Maven 命令行设置属性【英文标题】:Setting properties via Maven command line 【发布时间】:2016-04-15 11:20:21 【问题描述】:

我对在使用 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

我不太了解这种行为。有人能启发我吗?

【问题讨论】:

【参考方案1】:

是的,你应该有

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

注意在argLine 中添加了-D

让我们解释一下原因。 argLine 确实是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 属性。您正在添加系统属性。

【讨论】:

【参考方案2】:

关于您配置测试的方法

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

Maven 命令行参数的推荐用法是为构建配置 Maven 插件、构建环境和 Java 配置。 尽可能少地使用功能、配置和插件。否则您将面临大量问题,并且调整所有您想要的标准化构建不意味着 sh*t-for-me-Gradle 会感觉更舒服.

【讨论】:

这里的配置文件不会过分吗?我只想设置java.util.logging.config.class 属性来控制我的应用程序所依赖的第三方库的日志记录输出。 如果命令行参数是“让东西在你的计算机上工作”,那就去吧。但是,如果该代码打算在其他地方运行;您必须提供非常详细的说明来添加命令行选项。即使将这样的配置放在 pom 中也是一种气味。我以前没有解决过这个特殊问题,但是像 SLF4J 这样的日志记录可能会从异构日志框架中解决问题。

以上是关于通过 Maven 命令行设置属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 Maven 的 Spring Boot 属性从命令行运行 flyway 命令

从命令行停用 Maven 配置文件

从 Maven 命令行 TestNG 更改 .properties 值

安装maven,中央仓库可以通过浏览器访问,但是命令行新建项目出错。

从命令行获取 pom.xml 属性

maven 命令行指定 localRepository 路径