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

时间:2016-02-05 04:15:22

标签: java xml maven

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

如果你想在编译时提供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文件。各种打包/部署形式因素可能需要稍微不同的方式来获取输入流。

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

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

在表单中提供给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()

在测试代码中访问它们