
今次的文章範例是講解如何使用Maven Profile,以下會使用一些例子講解如何在不同環境下傳送不同參數。
範例使用環境:
Maven:3.5.3
1.首先來看看Maven Profiles基本是怎樣的。
1.1 一個基本的Profile
pom.xml
<profile>
<id>profile_test</id>
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
</profile>
1.2 如要在打包時啓用這個profile,需要加入 -P 參數。
$ mvn package -Pprofile_test
1.3 如需要啓用多個profile,可以 -P 參數後以逗號分隔。
$ mvn package -P profile_test, profile_test_2
1.4 可以加入 maven-help-plugin,透過執行compile和package階段時,可以顯示啓用的profile。
<build>
<plugins>
<!-- display active profile in compile phase -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-help-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>show-profiles</id>
<phase>compile</phase>
<goals>
<goal>active-profiles</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
於下次執行compile階段時,會像如下顯示
$ mvn compile -P profile_test
[INFO] --- maven-help-plugin:3.1.0:active-profiles (show-profiles) @ demo ---
[INFO]
Active Profiles for Project 'com.vvtitan:demo:jar:1.0':
The following profiles are active:
- profile_test (source: com.vvtitan:demo:1.0)
2.多個Profiles – 範例一
2.1 建立一個 properties 文件。
resources/db.properties
db.driverClassName=${db.driverClassName}
db.url=${db.url}
db.username=${db.username}
db.password=${db.password}
2.2 需要在pom.xml內啓用filtering功能,Maven會自動將profile的值取代properties內的${}值。
pom.xml
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
2.3 在pom.xml的profiles建立兩個或以上profile
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
<property>
<name>env</name>
<value>dev</value>
</property>
</activation>
<properties>
<db.driverClassName>com.mysql.jdbc.Driver</db.driverClassName>
<db.url>jdbc:mysql://demo:3306/dev</db.url>
<db.username>demo</db.username>
<db.password>demo</db.password>
</properties>
</profile>
<profile>
<id>prod</id>
<activation>
<property>
<name>env</name>
<value>prod</value>
</property>
</activation>
<properties>
<db.driverClassName>com.mysql.jdbc.Driver</db.driverClassName>
<db.url>jdbc:mysql://demo:3306/prod</db.url>
<db.username>demo</db.username>
<db.password>demo</db.password>
</properties>
</profile>
2.4 在主程式載入properties和列印查看是否成功。
public static void main(String[] args) {
App app = new App();
Properties prop = app.loadPropertiesFile("db.properties");
prop.forEach((k, v) -> System.out.println(k + ":" + v));
}
public Properties loadPropertiesFile(String filePath) {
Properties prop = new Properties();
try (InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(filePath)) {
prop.load(resourceAsStream);
} catch (IOException e) {
System.err.println("Unable to load properties file : " + filePath);
}
return prop;
}
2.5 編輯完成後便可進行測試。
# 如沒有使用參數,便會使用預設 dev
$ mvn package
$ java -jar target/demo-1.0.jar
db.password:demo
db.driverClassName:com.mysql.jdbc.Driver
db.username:demo
db.url:jdbc:mysql://demo:3306/dev
# 使用 -P 參數指定
$ mvn package -P prod
$ mvn package -D env=prod
$ java -jar target/demo-1.0.jar
db.password:demo
db.driverClassName:com.mysql.jdbc.Driver
db.username:demo
db.url:jdbc:mysql://demo:3306/prod
3.多個Profiles – 範例二
第二種方式是將所有值都放置在properties檔案內。
3.1 建立一個 properties 文件,Maven會用作映射值。
resources/config.properties
db.driverClassName=${db.driverClassName}
db.url=${db.url}
db.username=${db.username}
db.password=${db.password}
3.2 建立多個不同環境使用的不同值的 properties 文件
resources/env/config.dev.properties
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://dev:3306/dev
db.username=dev
db.password=dev
resources/env/config.test.properties
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://test:3306/test
db.username=test
db.password=test
resources/env/config.prod.properties
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://prod:3306/prod
db.username=prod
db.password=prod
3.3 需要在pom.xml內啓用filtering功能。
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<env>dev</env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
</profiles>
<build>
<filters>
<filter>src/main/resources/env/config.${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>*.properties</include>
</includes>
</resource>
</resources>
</build>
3.4 在主程式載入properties和列印查看是否成功。
public static void main(String[] args) {
App app = new App();
Properties prop = app.loadPropertiesFile("db.properties");
prop.forEach((k, v) -> System.out.println(k + ":" + v));
}
public Properties loadPropertiesFile(String filePath) {
Properties prop = new Properties();
try (InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(filePath)) {
prop.load(resourceAsStream);
} catch (IOException e) {
System.err.println("Unable to load properties file : " + filePath);
}
return prop;
}
3.5 編輯完成後便可進行測試。
$ mvn package
$ java -jar target/demo-1.0.jar
db.password:dev
db.driverClassName:com.mysql.jdbc.Driver
db.username:dev
db.url:jdbc:mysql://dev:3306/dev
$ mvn package -P test
$ java -jar target/demo-1.0.jar
db.password:test
db.driverClassName:com.mysql.jdbc.Driver
db.username:test
db.url:jdbc:mysql://test:3306/test
$ mvn package -P prod
$ java -jar target/demo-1.0.jar
db.password:prod
db.driverClassName:com.mysql.jdbc.Driver
db.username:prod
db.url:jdbc:mysql://prod:3306/prod
這樣配置後,在多個不同環境上運行都方便很多,快來嘗試使用這種配置方法吧。