java - 在 Maven 配置文件中设置系统变量

标签 java maven environment-variables

是否可以在 maven 中设置可从 java 类中获得的系统属性。

我已经看到这在 surefire 插件中是可能的 ( here ),如下所示;

String param = System.getProperty("my_parameter1");

<configuration>
    <systemPropertyVariables>
        <my_property1>${my_property1}</my_property1>
    </systemPropertyVariables>
</configuration>

但是我想了解我正在工作的环境,我已经将 prod 或 dev 作为 maven 配置文件参数传递 - 是否有可能以某种方式通过设置变量来获取代码中的句柄在我调用的配置文件中,然后调用 system.getProperty 或其他方式?

谢谢

我的 pom 文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>core</groupId>
    <artifactId>core</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <testSourceDirectory>test</testSourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <warSourceDirectory>WebContent</warSourceDirectory>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.17</version>
                <configuration>
                    <parallel>methods</parallel>
                    <threadCount>10</threadCount>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
                <version>2.1</version>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>resources</directory>
                <includes>
                    <include>**/*.png</include>
                </includes>
            </resource>
        </resources>
    </build>
    <dependencies>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.9.5</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.facebook4j</groupId>
            <artifactId>facebook4j-core</artifactId>
            <version>[2.0,)</version>
        </dependency>
        <dependency>
            <groupId>com.relayrides</groupId>
            <artifactId>pushy</artifactId>
            <version>0.3</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.6.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>javax.mail-api</artifactId>
            <version>1.5.2</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.threewks.thundr</groupId>
            <artifactId>thundr-mailgun</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.3</version>
        </dependency>
    </dependencies>
    <profiles>
        <profile>
            <id>DEV</id>
            <properties>
                <swifte.url>jdbc:mariadb://ip:3306/swifte?autoReconnect=true</swifte.url>
                <swifte.username>user</swifte.username>
                <swifte.password>pass</swifte.password>
            </properties>
            <build>
                <resources>
                    <resource>
                        <directory>resources</directory>
                        <includes>
                            <include>JavaPNSDev.p12</include>
                        </includes>
                    </resource>
                </resources>
            </build>
        </profile>
        <profile>
            <id>PROD</id>
            <properties>
                <swifte.url>jdbc:mariadb://ip:3306/swifte?autoReconnect=true</swifte.url>
                <swifte.username>username</swifte.username>
                <swifte.password>pass</swifte.password>
            </properties>
            <build>
                <resources>
                    <resource>
                        <directory>resources</directory>
                        <includes>
                            <include>JavaPNSProd.p12</include>
                        </includes>
                    </resource>
                </resources>
            </build>
        </profile>
    </profiles>
</project>

最佳答案

您应该查看 exec-maven-plugin .

使用以下配置(注意 <systemProperties> )...

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.3.2</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>java</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <mainClass>com.example.Main</mainClass>
        <arguments>
            <argument>argument1</argument>
        </arguments>
        <systemProperties>
            <systemProperty>
                <key>hello.world</key>
                <value>Hello Stack Overflow!</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>

...和下​​面的类...

package com.example;
public class Main {
    public static void main(String[] args) {
        String prop = System.getProperty("hello.world");
        System.out.println(prop);
    }
}

...并运行 package (注意配置中的阶段——你可以根据需要进行更改,也许是安装),它打印出值 Hello Stack Overflow!来自 key hello.world .所以基本上,插件会在您构建时执行您的程序。

另见 exec:exec 目标。在示例中,我使用了 exec:java 目标,但两者在运作方式上有所不同。

exec:exec executes programs and Java programs in a separate process.

exec:java executes Java programs in the same VM.


更新

Currently I am setting some values in properties based on the profile in my maven pom file. Is it possible to set this system property in the profile ? because really, i only have one pom file for dev and prod and its within the profile i would need to set it.

是的,只需使用 ${property.name}<value>系统属性元素的元素。例如:

<profiles>
    <profile>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <id>world</id>
        <properties>
            <hello.world>Hello World!</hello.world>
        </properties>
    </profile>
    <profile>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <id>stack</id>
        <properties>
            <hello.world>Hello Stack Overflow</hello.world>
        </properties>
    </profile>
</profiles>

还有插件<systemProperties> :

<systemProperties>
    <systemProperty>
        <key>hello.world</key>
        <value>${hello.world}</value>
    </systemProperty>
</systemProperties>

只需将配置文件更改为 stackworld , 消息将打印 Hello Stack OverflowHello World , 分别。


更新 2

另一个插件是 properties-maven-plugin .一段时间内没有对它进行任何操作,但通过一些测试,必要的功能已经存在。

它有一个 set-system-properties 目标和其他一些useful goals帮助简化属性(property)管理

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0-alpha-2</version>
    <executions>
        <execution>
            <!-- any phase before your app deploys -->
            <phase>prepare-package</phase>
            <goals>
                <goal>set-system-properties</goal>
            </goals>
            <configuration>
                <properties>
                    <property>
                        <name>hello.world.two</name>
                        <value>Hello World!</value>
                    </property>
                </properties>
            </configuration>
        </execution>
    </executions>
</plugin>

关于java - 在 Maven 配置文件中设置系统变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25604969/

相关文章:

java - 我根本不了解@Resource mappedName 元素

java - 是否可以将对象存储到 Java 中的属性文件?

docker - 如何在 Docker 中共享全局环境变量?

cmd - Chocolatey Ngrok.portable 不工作

java - 无法在另一台 PC 上运行 JAR 文件。环境变量可能有问题?

Java:从int到short,从float到short

java - 为什么 HashSet 的名称中有 "Hash"?

java - 为什么 'provided' Maven 依赖项不是 'transitive' ?

java - Spring Boot EntityManagerFactory 未定义且不允许@ManyToOne

apache-flex - Flex & Maven : How to upgrade playerglobal version in pom. xml