如何从java中的maven读取系统属性

时间:2018-04-20 04:42:20

标签: java maven system-properties

我正在开发一个在tomcat服务器上运行的Web应用程序。 我有不同环境的不同属性文件,所以我想从java文件中的pom文件中读取我的环境变量,并在运行命令mvn clean install时设置该环境属性。

这是我的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>marketingcenter</groupId>
    <artifactId>marketingcenter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>  

    <dependencies>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>jsr311-api</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.8</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>


    </dependencies>

    <profiles>
        <!-- The configuration of the development profile -->
        <profile>
            <id>dev</id>
            <!-- The development profile is active by default -->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>                
                <environment.id>environment_dev</environment.id>
            </properties>
        </profile>
        <!-- The configuration of the production profile -->
        <profile>
            <id>prod</id>
             <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <environment.id>environment_prod</environment.id>
            </properties>
        </profile>
        <!-- The configuration of the testing profile -->
        <profile>
            <id>qa</id>
             <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <environment.id>environment_qa</environment.id>
            </properties>
        </profile>
        <profile>
            <id>reg</id>
             <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <environment.id>environment_reg</environment.id>
            </properties>
        </profile>
    </profiles>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <resources>
            <resource>
                <directory>src</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
        </resources>
        <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <warSourceDirectory>WebContent</warSourceDirectory>
                </configuration>
            </plugin>
       <!-- <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>environment</name>
                        <value>environment_dev</value>
                    </property>
                </properties>
            </configuration>
        </execution>
    </executions>
</plugin> -->




         <!--   <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.keurig.config.DBUtils</mainClass>
                    <arguments>
                        <argument>argument1</argument>
                    </arguments>
                    <systemProperties>
                        <systemProperty>
                            <key>environment</key>
                            <value>environment_dev</value>
                        </systemProperty>
                    </systemProperties>
                </configuration>
                </plugin>
                 -->
       <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.21.0</version>
        <configuration>
          <systemPropertyVariables>
            <environment>environment_dev</environment>
          </systemPropertyVariables>
        </configuration>
      </plugin>

        </plugins>
        </pluginManagement>
    </build>
</project>

我已经尝试了多个被评论的内容,但都给出了相同的问题null值。 我正在通过以下DBUtils类中的代码来读取环境属性 -

public class DBUtils {
    private static final Logger LOG=Logger.getLogger(DBUtils.class);

    public static Connection getConnection() throws SQLException {
        Connection connection = null;

              String str =System.getProperty("environment");
              System.out.println("deven"+str);


            //static Properties _config = PropertyLoader.loadProperties(System.getProperty("environment"));
        Properties prop = PropertyLoader.loadProperties(str);
        String url = prop.getProperty("databaseUrl");
        String driverName = prop.getProperty("databaseDriver");
    }

但我每次都会变空。 这是结果 -

devennull
devennull
2018-04-20 12:52:22,424 [http-nio-8080-exec-8] ERROR
java.lang.IllegalArgumentException: null input: name
        at com.app.data.PropertyLoader.loadProperties(PropertyLoader.java:51)
        at com.app.data.PropertyLoader.loadProperties(PropertyLoader.java:128)
        at com.app.data.DBUtils.getConnection(DBUtils.java:23)

2 个答案:

答案 0 :(得分:0)

据我所知,当你想在maven阶段使用main方法执行java类时,会使用插件。系统属性未传递给保存Web应用程序执行的JVM。

如果在DBUtils类中设置void main,您将看到系统属性,因为此执行发生在具有系统属性的JVM中。

public static void main(String[] args) {
        String k = System.getProperty("environment");
        System.out.println(k);
}

答案 1 :(得分:0)

最简单的方法-使用中间app.properties文件: 例如:

1-具有environment.server.name变量的个人资料摘要:

<profile>
    <id>dev</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <environment.server.name>DEVELOPMENT</environment.server.name>
    </properties>
</profile>

2-在app.properties文件中(如果不存在则创建。通常在src/main/resources中),我们使用简单的映射:

environment.server.name=${environment.server.name}

3-创建将处理应用程序属性的简单类:

public class AppProperties {
 private static final String PROPERTIES_FILE_NAME = "app.properties";
 public static final String SERVER_NAME;
 static {
     try {
          final PropertiesConfiguration configuration = new 
          PropertiesConfiguration(PROPERTIES_FILE_NAME);
          SERVER_NAME = configuration.getString("environment.server.name");
         } catch (ConfigurationException e) {
                 throw new RuntimeException("Failed to load properties", e);
           } 
   }
  private AppProperties() {}
}

4-您现在可以在应用中使用属性文件:

String serverName = AppProperties.SERVER_NAME;