Exemple de profils Maven

Exemple de profils Maven

Dans cet article, nous allons vous montrer quelques exemples de profils Maven pour passer différents paramètres (paramètres de serveur ou de base de données) pour différents environnements (dev, test ou prod).

P.S Tested with Maven 3.5.3

1. Profils de base Maven

1.1 A simple profile to skip the unit test.

pom.xml

    
    
        xtest
        
            true
        
    

1.2 To activate a profile, add -P option.

Terminal

# Activate xtest profile to skip unit test and package the project

$ mvn package -Pxtest

1.3 To activate multiple profiles :

Terminal

$ 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
                        
                    
                
            

        
    

La prochaine fois, le profil actif actuel sera affiché en phase de compilation.

Terminal

$ 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. Profils Maven - Exemple 1

Exemple de profil Maven pour transmettre différentes valeurs de propriétés aux environnements de développement et de production.

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 mappera les${} dansresources/db.properties avec les propriétés de profil Maven actives.

Note
Lire ceciMaven 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.

Terminal

# 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. Profils Maven - Exemple 2

Cet exemple de profil Maven mettra tout dans le fichier de propriétés.

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. Telle est la clé!

Note
Lire ceciMaven 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.

Terminal

# 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

La fin, faites-moi savoir votre cas d'utilisation :)

Télécharger le code source

$ git clone https://github.com/example/maven-examples.git
$ cd maven-profiles

Testez l'exemple 1 avec le profil «prod»

$ mvn -pl example1 package -Pprod
$ java -jar example1/target/example1-1.0.jar

Testez l'exemple 2 avec le profil «test»

$ mvn -pl example2 package -Ptest
$ java -jar example2/target/example2-1.0.jar