How to read system property from maven in java

Devendra Singh picture Devendra Singh · Apr 20, 2018 · Viewed 7k times · Source

I am working on a web application which is running on tomcat server. I have different properties files for the different environment, So I want to read my environment variable from pom file in java file and set that environment property when running command mvn clean install.

Here is my pom file:

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

I have tried multiple things which are commented but all are giving same problem null value. And I am reading environment property by following code which is in DBUtils class-

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");
    }
}

but I am getting null every time. this is the result-

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)

Answer

Roman Romaniuk picture Roman Romaniuk · Oct 11, 2018

The easiest way - to use intermediate app.properties file: For example:

1 - Maven snippet of profile with environment.server.name variable:

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

2 - In app.properties file (create if not exist. Usually in src/main/resources) we use simple mapping:

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

3 - Create simple class that will handle application properties:

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 - You can use the properties file in your app now:

String serverName = AppProperties.SERVER_NAME;