Пример Maven Profiles

Пример Maven Profiles

В этой статье мы покажем вам несколько примеров профилей Maven для передачи различных параметров (параметров сервера или базы данных) для различных сред (dev, test или prod).

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 Profiles - пример 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 Profiles - пример 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

Протестируйте пример 1 с профилем «prod»

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

Протестируйте пример 2 с профилем «test»

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