我需要从命令行传递两个参数,例如shell
和version
。
问题是我无法理解如何在pom.xml
中定义这两个变量,然后在运行时获取Java代码中的参数。
当我将其作为Maven项目运行时,如何设置参数值?
任何建议都会有很大帮助。谢谢!
答案 0 :(得分:4)
如果你想在编译时提供shell和版本作为maven build 的参数(当你将代码构建到* .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文件。各种打包/部署形式因素可能需要稍微不同的方式来获取输入流。
在这种情况下,你不关心将嵌入到编译项目中的这些参数存储在任何地方,你只想在构建时访问它们(比如你的单元测试代码)。
在表单中提供给java的任何参数(注意不允许空格):
java <whatever> -Dprop.name=value
在运行时可用,如下所示:
String propValue = System.getProperty("prop.name");
这里的一个轻微的复杂功能,特别是maven和单元测试,是maven surefire插件(运行单元测试的插件)以及maven故障安全插件(这是运行系统测试的密切相关的插件) fork off a new JVM to run your unit tests in。 但是,根据他们的文件:
来自主maven进程的系统属性变量也将传递给分叉进程
所以上面的解决方案应该工作。如果它没有,你可以配置插件不要分叉单元测试:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>
或者自己将thise参数传递给分叉进程:
<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()