Java Maven Profiles 範例

今次的文章範例是講解如何使用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

這樣配置後,在多個不同環境上運行都方便很多,快來嘗試使用這種配置方法吧。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

驗證碼 * Time limit is exhausted. Please reload CAPTCHA.

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料