在 exec-maven-plugin 中设置 systemProperty 不起作用
set systemProperty in exec-maven-plugin does not work
这是我的 pom.xml 文件:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<profiles>
<profile>
<id>my_proj</id>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.4.0</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath />
<argument>com.test.Main</argument>
</arguments>
<systemProperties>
<systemProperty>
<key>someKey</key>
<value>someValue</value>
</systemProperty>
</systemProperties>
<environmentVariables>
<someKey>
someValue
</someKey>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
并在 Main.java
public static void main(String[] args) {
System.out.println("hello world" + System.getenv("someKey") + " " + System.getProperty("someKey"));
}
我运行
时的输出
mvn install -Pmy_proj
是
hello worldsomeValue null
我似乎无法获取 systemProperty 值。我做错了什么?
systemProperty
不起作用只是因为它不是 exec
goal of the exec-maven-plugin
的预期元素。
查看官方exec
goal page,没有指定systemProperties
元素。因此,您的配置对 Maven 仍然有效,只是因为格式正确 XML,但它会被 exec-maven-plugin
.
忽略
来自官方 Maven Pom Reference 关于插件 configuration
元素:
It may be good to note that all configuration elements, wherever they are within the POM, are intended to pass values to another underlying system, such as a plugin. In other words: values within a configuration element are never explicitly required by the POM schema, but a plugin goal has every right to require configuration values.
您正在混淆 systemProperties
configuration entry foreseen by its java
目标。这个选项在那里可用是因为它的上下文:它是为 java 执行而设计的。另一方面,exec
目标更为通用,因此无法预见只有 java 程序才需要的选项。
要通过 exec
目标将系统属性传递给 Java 执行,您可以使用 arguments
configuration entry and use the -D
notation
-Dproperty=value
Sets a system property value.
进一步注意,根据官方 Running Java programs with the exec goal 文档,-D
参数应该放在第一位:
<configuration>
<executable>java</executable>
<arguments>
<argument>-DsomeKey2=someValue2</argument>
<argument>-classpath</argument>
<classpath />
<argument>com.test.Main</argument>
</arguments>
<environmentVariables>
<someKey>someValue</someKey>
</environmentVariables>
</configuration>
另外,环境和系统变量名不能设置相同属性,否则系统属性不会设置。
这是我的 pom.xml 文件:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<profiles>
<profile>
<id>my_proj</id>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.4.0</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath />
<argument>com.test.Main</argument>
</arguments>
<systemProperties>
<systemProperty>
<key>someKey</key>
<value>someValue</value>
</systemProperty>
</systemProperties>
<environmentVariables>
<someKey>
someValue
</someKey>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
并在 Main.java
public static void main(String[] args) {
System.out.println("hello world" + System.getenv("someKey") + " " + System.getProperty("someKey"));
}
我运行
时的输出mvn install -Pmy_proj
是
hello worldsomeValue null
我似乎无法获取 systemProperty 值。我做错了什么?
systemProperty
不起作用只是因为它不是 exec
goal of the exec-maven-plugin
的预期元素。
查看官方exec
goal page,没有指定systemProperties
元素。因此,您的配置对 Maven 仍然有效,只是因为格式正确 XML,但它会被 exec-maven-plugin
.
来自官方 Maven Pom Reference 关于插件 configuration
元素:
It may be good to note that all configuration elements, wherever they are within the POM, are intended to pass values to another underlying system, such as a plugin. In other words: values within a configuration element are never explicitly required by the POM schema, but a plugin goal has every right to require configuration values.
您正在混淆 systemProperties
configuration entry foreseen by its java
目标。这个选项在那里可用是因为它的上下文:它是为 java 执行而设计的。另一方面,exec
目标更为通用,因此无法预见只有 java 程序才需要的选项。
要通过 exec
目标将系统属性传递给 Java 执行,您可以使用 arguments
configuration entry and use the -D
notation
-Dproperty=value
Sets a system property value.
进一步注意,根据官方 Running Java programs with the exec goal 文档,-D
参数应该放在第一位:
<configuration>
<executable>java</executable>
<arguments>
<argument>-DsomeKey2=someValue2</argument>
<argument>-classpath</argument>
<classpath />
<argument>com.test.Main</argument>
</arguments>
<environmentVariables>
<someKey>someValue</someKey>
</environmentVariables>
</configuration>
另外,环境和系统变量名不能设置相同属性,否则系统属性不会设置。