Maven - Maven Build Profiles - maven tutorial
maven tutorial tags : apache maven , maven repository , maven central
How to Build Profile in Maven ?
- A Build profile is a set of configuration values which can be used to set or override default values of Maven build.
- Using a build profile, you can customize build for different environments such as Production v/s Development environments.
- Profiles are specified in pom.xml file using its activeProfiles / profiles elements and are triggered in variety of ways.
- Profiles modify the POM at build time, and are used to give parameters different target environments.
- For example, the path of the database server in the development, testing, and production environments.
Types of Build Profile:
- Build profiles are majorly of three types:
Type | Where it is defined |
---|---|
Per Project | Defined in the project POM file, pom.xml |
Per User | Defined in Maven settings xml file (%USER_HOME%/.m2/settings.xml) |
Global | Defined in Maven global settings xml file (%M2_HOME%/conf/settings.xml) |
Profile Activation:
- A Maven Build Profile can be activated in various ways.
- Explicitly using command console input.
- Through maven settings.
- Based on environment variables (User/System variables).
- OS Settings (for example, Windows family).
- Present/missing files.
Profile Activation Examples:
- Let us assume following directory structure of your project:
![](https://wikitechy.com/tutorials/maven/img/maven-images/maven-build-profiles.png)
- Now, under src/main/resources there are three environment specific files:
File Name | Description |
---|---|
env.properties | default configuration used if no profile is mentioned. |
env.test.properties | test configuration when test profile is used. |
env.prod.properties | production configuration when prod profile is used. |
Explicit Profile Activation:
- This will allow us to echo text messages for different profiles.
- We will be using pom.xml to define different profiles and will activate profile at command console using maven command.
- Assume, we've created following pom.xml in C:\MVN\project folder.
![Maven Build](https://wikitechy.com/tutorials/maven/img/maven-images/maven-build-profile.gif)
Learn Maven Tutorial - Maven Build - Maven Example
maven tutorial tags : apache maven , maven repository , maven central
Sample Code
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<profiles>
<profile>
<id>test</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Using env.test.properties</echo>
<copy file="src/main/resources/env.test.properties" tofile
="${project.build.outputDirectory}/env.properties"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- And assume, we've created following properties file in C:\MVN\project\src\resources folder.
env.properties
environment=debug
env.test.properties
environment=test
env.prod.properties
environment=prod
- Now open command console, go to the folder containing pom.
- xml and execute the following mvn command.
- Pass the profile name as argument using -P option.
C:\MVN\project>mvn test -Ptest
- Maven will start processing and show the output of test build profile.
maven tutorial tags : apache maven , maven repository , maven central
Output
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building project 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ project --
-
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ project ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ pr
oject ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\project\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ project
---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ project ---
[INFO] Surefire report directory: C:\MVN\project\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.companyname.bank.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (default) @ project ---
[INFO] Executing tasks
[echo] Using env.test.properties
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.953 s
[INFO] Finished at: 2015-09-27T11:54:45+05:30
[INFO] Final Memory: 9M/247M
[INFO] ------------------------------------------------------------------------
- Add another profile element to profiles element of pom.xml (copy existing profile element and paste it where profile elements ends).
- Update id of this profile element from test to normal.
- Update task section to echo env.properties and copy env.properties to target directory
- Again repeat above three steps, update id to prod and task section for env.prod.properties
- That's all. Now you've three build profiles ready (normal / test / prod).
- Now open command console, go to the folder containing pom.xml and execute the following mvn commands. Pass the profile names as argument using -P option.
C:\MVN\project>mvn test -Pnormal
C:\MVN\project>mvn test -Pprod
Profile Activation via Maven Settings:
- Open Maven settings.xml file available in %USER_HOME%/.m2 directory where %USER_HOME% represents user home directory.
- If settings.xml file is not there then create a new one.
- Add test profile as an active profile using activeProfiles node as shown below in example
maven tutorial tags : apache maven , maven repository , maven central
Sample Code
<settings xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>maven.dev.snaponglobal.com</id>
<name>Internal Artifactory Maven repository</name>
<url>http://repo1.maven.org/maven2/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
<activeProfiles>
<activeProfile>test</activeProfile>
</activeProfiles>
</settings>
- Now open command console, go to the folder containing pom.
- xml and execute the following mvn command.
- Do not pass the profile name using -P option.Maven will display result of test profile being an active profile.
C:\MVN\project>mvn test
Profile Activation via Environment Variables:
- Now remove active profile from maven settings.
- xml and update the test profile mentioned in pom.xml.
- Add activation element to profile element as shown below.
- The test profile will trigger when the system property "env" is specified with the value "test".
- Create a environment variable "env" and set its value as "test".
<profile>
<id>test</id>
<activation>
<property>
<name>env</name>
<value>test</value>
</property>
</activation>
</profile>
- Let's open command console, go to the folder containing pom.xml and execute the following mvn command.
C:\MVN\project>mvn test
Profile Activation via Operating System
- Activation element to include os detail as shown below. This test profile will trigger when the system is windows XP.
<profile>
<id>test</id>
<activation>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
</activation>
</profile>
- Now open command console, go to the folder containing pom.xml and execute the following mvn commands.
- Do not pass the profile name using -P option.Maven will display result of test profile being an active profile.
C:\MVN\project>mvn test
maven tutorial tags : apache maven , maven repository , maven central
Profile Activation via Present/Missing File
- Now activation element to include os.
<profile>
<id>test</id>
<activation>
<file>
<missing>target/generated-sources/axistools/wsdl2java/
com/companyname/group</missing>
</file>
</activation>
</profile>
- Now open command console, go to the folder containing pom.xml and execute the following mvn commands.
- Do not pass the profile name using -P option.Maven will display result of test profile being an active profile.