gpt4 book ai didi

java - 如何在 Maven pom.xml 中定义属性并从命令行传递参数?

转载 作者:行者123 更新时间:2023-11-29 03:00:39 31 4
gpt4 key购买 nike

我需要从命令行传递两个参数,比如 shellversion

问题是我无法理解如何在 pom.xml 中定义这两个变量,然后在运行时在我的 Java 代码中获取参数。

另外,当我将其作为 Maven 项目运行时,如何设置参数值?

任何建议都会有很大帮助。谢谢!!

最佳答案

选项 1 - 将构建参数“存储”到已编译的项目中,以便在项目运行时检索

如果您想提供 shell 和版本作为 Maven 构建的参数在编译时(当您将代码构建到一个 *.jar 文件中时),然后在某些稍后一点当您的编译代码运行时您想要检索这些参数。

这可以通过使用 maven resources plugin's filtering capability 来实现:

假设您的项目结构是

pom.xml
src/
main/
java/
Main.java
resources/
strings.properties

您可以将属性占位符放入 strings.properties 中:

shell=${my.shell}
version=${my.version}

然后在 pom.xml 中配置 maven 资源插件(将 src/main/resources/* 复制到目标目录中,jar 插件稍后将从中获取它)以在文件(称为过滤):

<project>
...
<name>bob</name>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
</resources>
...
</build>
...
</project>

您可以将这些参数作为系统属性提供给 Maven(在命令行上使用 -D[name]=[value]),如下所示:

mvn clean install -Dmy.shell=X -Dmy.version=Y

然后,如果您要查看已处理的资源文件(应该在/target 中),您会看到资源插件已将文件过滤成:

shell=X
version=Y

在运行时读回它会是这样的:

public class Main {
public static void main (String[] args) {
InputStream is = Main.class.getClassLoader().getResourceAsStream("strings.properties");
Properties props = new Properties();
props.load(is);
System.out.println("shell is " + props.get("shell"));
}
}

这是假设您的代码是从生成的 jar 文件“内部”运行的。各种打包/部署形式因素可能需要稍微不同的方式来获取要读取的输入流。

选项 2 - 从作为构建一部分运行的代码访问提供给 Maven 构建的参数(比如单元测试)

在这种情况下,您不关心将这些嵌入到编译项目中的任何地方的参数存储,您只想在构建时访问它们(比如从您的单元测试代码)。

在表单中提供给 java 的任何参数(注意不允许有空格):

java <whatever> -Dprop.name=value

像这样在运行时可用:

String propValue = System.getProperty("prop.name");

这里有一点复杂,特定于 maven 和单元测试,是 maven surefire 插件(运行单元测试的插件)和 maven failsafe 插件(运行系统测试的密切相关的插件) fork off a new JVM to run your unit tests in .然而,根据他们的文档:

System property variables from the main maven process are passed to the forked process as well

所以上面的解决方案应该有效。如果没有,您可以将插件配置为不 fork 单元测试:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>

或者自己将此参数传递给 fork 进程:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<systemPropertyVariables>
<my.schema>${my.schema}</my.schema>
</systemPropertyVariables>
</configuration>
</plugin>

然后它们应该可以通过 System.getProperty()

在测试代码中访问

关于java - 如何在 Maven pom.xml 中定义属性并从命令行传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35216193/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com