通过 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 命令行 TestNG 更改 .properties 值