我正在开发一个在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)
答案 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;