提问者:小点点

如何读取系统属性从maven在java


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

这是我的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>

我尝试了多个被注释的东西,但都给出了相同的问题空值。我正在通过遵循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个答案

匿名用户

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

1-带有environment.server.name变量的Maven配置文件片段:

<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;

匿名用户

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

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

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