Mavenプロファイルの例

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プロファイルの例。

image

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プロファイルの例では、すべてをプロパティファイルに配置します。

image

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