Mavenプロファイルの例
この記事では、異なる環境(dev、test、またはprod)に異なるパラメーター(サーバーまたはデータベースパラメーター)を渡すためのMavenプロファイルの例をいくつか示します。
P.S Tested with Maven 3.5.3
1. 基本的なMavenプロファイル
1.1 A simple profile to skip the unit test.
pom.xml
xtest true
1.2 To activate a profile, add -P
option.
ターミナル
# Activate xtest profile to skip unit test and package the project $ mvn package -Pxtest
1.3 To activate multiple profiles :
ターミナル
$ mvn package -P xtest, another-profile-id # multi modules, same syntax $ mvn -pl module-name package -P xtest, another-profile-id
1.4 Always add maven-help-plugin
to display the active profile during the compile or package phase, it will save you a lot of debugging time.
pom.xml
org.apache.maven.plugins maven-help-plugin 3.1.0 show-profiles compile active-profiles
次回、コンパイル段階で現在のアクティブなプロファイルが表示されます。
ターミナル
$ mvn compile -P xtest [INFO] --- maven-help-plugin:3.1.0:active-profiles (show-profiles) @ example1 --- [INFO] Active Profiles for Project 'com.example:example1:jar:1.0': The following profiles are active: - xtest (source: com.example:example1:1.0)
2. Mavenプロファイル-例1
さまざまなプロパティ値を開発環境と実稼働環境に渡すためのMavenプロファイルの例。
2.1 A properties file.
resources/db.properties
db.driverClassName=${db.driverClassName} db.url=${db.url} db.username=${db.username} db.password=${db.password}
2.2 Enable the filtering. Mavenは、resources/db.properties
の${}
をアクティブなMavenプロファイルプロパティにマップします。
Note
これを読むMaven filtering
pom.xml
src/main/resources true
2.3 Create two profiles ids (dev and prod) with different properties values.
pom.xml
maven-profiles com.example 1.0 4.0.0 example1 dev true env dev com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/dev example 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 prod env prod com.mysql.jdbc.Driver jdbc:mysql://live01:3306/prod example 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 src/main/resources true org.apache.maven.plugins maven-shade-plugin 3.2.0 package shade com.example.example1.App1
2.4 Loads the properties file and print it out.
App1.java
package com.example.example1; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class App1 { public static void main(String[] args) { App1 app = new App1(); 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 Test it.
ターミナル
# default profile id is 'dev' $ mvn package $ java -jar target/example1-1.0.jar db.password:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 db.driverClassName:com.mysql.jdbc.Driver db.username:example db.url:jdbc:mysql://localhost:3306/dev # enable profile id 'prod' with -P prod or -D env=prod $ mvn package -P prod $ mvn package -D env=prod $ java -jar target/example1-1.0.jar db.password:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 db.driverClassName:com.mysql.jdbc.Driver db.username:example db.url:jdbc:mysql://live01:3306/prod
3. Mavenプロファイル-例2
このMavenプロファイルの例では、すべてをプロパティファイルに配置します。
3.1 A properties file, later Maven will map the value depend on the profile id.
resources/config.properties
# Database Config db.driverClassName=${db.driverClassName} db.url=${db.url} db.username=${db.username} db.password=${db.password} # Email Server email.server=${email.server} # Log Files log.file.location=${log.file.location}
3.2 Create different properties files for dev,test and production environment.
resources/env/config.dev.properties
# Database Config db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/dev db.username=example db.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 # Email Server email.server=email-dev:8888 # Log Files log.file.location=dev/file.log
resources/env/config.test.properties
# Database Config db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://test01:3306/test db.username=example db.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 # Email Server email.server=email-test:8888 # Log Files log.file.location=test/file.log
resources/env/config.prod.properties
# Database Config db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://live01:3306/prod db.username=example db.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 # Email Server email.server=email-prod:25 # Log Files log.file.location=prod/file.log
3.3 Enable the filtering. これが鍵です!
Note
これを読むMaven filtering
pom.xml
maven-profiles com.example 1.0 4.0.0 example2 dev true dev prod prod test test src/main/resources/env/config.${env}.properties src/main/resources true *.properties org.apache.maven.plugins maven-shade-plugin 3.2.0 package shade com.example.example2.App2
3.4 Loads the properties file and print it out.
App1.java
package com.example.example2; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class App2 { public static void main(String[] args) { App2 app = new App2(); Properties prop = app.loadPropertiesFile("config.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 Test it.
ターミナル
# profile id dev (default) $ mvn package $ java -jar target/example2-1.0.jar log.file.location:dev/file.log db.password:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 db.driverClassName:com.mysql.jdbc.Driver db.username:example email.server:email-dev:8888 db.url:jdbc:mysql://localhost:3306/dev # profile id prod $ mvn package -P prod $ java -jar target/example2-1.0.jar log.file.location:prod/file.log db.password:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 db.driverClassName:com.mysql.jdbc.Driver db.username:example email.server:email-prod:25 db.url:jdbc:mysql://live01:3306/prod # profile id test $ mvn package -P test $ java -jar target/example2-1.0.jar log.file.location:test/file.log db.password:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 db.driverClassName:com.mysql.jdbc.Driver db.username:example email.server:email-test:8888 db.url:jdbc:mysql://test01:3306/test
最後に、ユースケースを教えてください:)
ソースコードをダウンロード
$ git clone https://github.com/example/maven-examples.git
$ cd maven-profiles
プロファイル「prod」
を使用して例1をテストします
$ mvn -pl example1 package -Pprod
$ java -jar example1/target/example1-1.0.jar
プロファイル「test」
を使用して例2をテストします
$ mvn -pl example2 package -Ptest
$ java -jar example2/target/example2-1.0.jar