Как прочитать системное свойство из Maven в Java

Я работаю над веб-приложением, которое работает на сервере Tomcat. У меня есть разные файлы свойств для разных сред, поэтому я хочу прочитать переменную среды из pom-файла в java-файле и установить это свойство среды при выполнении команды 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>

Я пробовал несколько вещей, которые комментируются, но все дают одинаковое значение проблемы. И я читаю свойство среды следующим кодом, который находится в классе 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 - фрагмент профиля Maven с 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;

Насколько я знаю, плагин используется, когда вы хотите выполнить Java-класс, с основным методом, на этапах maven. Системное свойство не передается в JVM, которая содержит выполнение вашего веб-приложения.

Если вы установите void main в своем классе DBUtils, вы увидите системное свойство, так как это выполняется в JVM, которая имеет системное свойство.

public static void main(String[] args) {
        String k = System.getProperty("environment");
        System.out.println(k);
}
Другие вопросы по тегам