问题
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)
回答1:
As far as I know the plugin is used when you want to execute a java class, with a main method, during maven phases. The system property is no being passed to the JVM that holds the execution of your web app.
If you set a void main in your DBUtils class you will see your system property as this execution happens in a JVM that has the system property.
public static void main(String[] args) {
String k = System.getProperty("environment");
System.out.println(k);
}
回答2:
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;
来源:https://stackoverflow.com/questions/49934111/how-to-read-system-property-from-maven-in-java