Maven Profiles 实现按条件编译

介绍

Maven Profiles的配置设置或重写默认值,另一组。Maven配置文件允许自定义生成不同的环境。配置文件配置在pom.xml文件每个文件有一个标识符。

可以让配置文件构建不同的环境。比如:

  • 生产和开发环境
  • 不同的操作系统,如linxu和windows等
  • 不同版本的jdk。

按不同的条件编译

通一个例子来了解 Maven Profile。默认的,编译插件把 javacdebug标识设置为true,把optimize设置成false
对于生产环境代码,我们想优化java代码和禁用调试信息。要做到这些,我们可以使用Maven Profile

从一个简单的pom.xml文件,移除编译申明,加入下面的代码片段.
aimple-app/pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
<profiles>
<profile>
<id>production</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<debug>false</debug>
<optimize>true</optimize>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
...

我们定义一个名为production的配置。在里面放入了编译插件的配置。
在配置中重新配置编译插件的参数。

运行mvn compile -X -X用于输出调试信息。
输出的可能是下面的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-compiler-plugin:3.1:compile' with basic configurator -->
[DEBUG] (f) basedir = C:\simpletest
[DEBUG] (f) buildDirectory = C:\simpletest\target
[DEBUG] (f) classpathElements = [C:\simpletest\target\classes]
[DEBUG] (f) compileSourceRoots = [C:\simpletest\src\main\java]
[DEBUG] (f) compilerId = javac
[DEBUG] (f) debug = true
[DEBUG] (f) encoding = UTF-8
[DEBUG] (f) failOnError = true
[DEBUG] (f) forceJavacCompilerUse = false
[DEBUG] (f) fork = false
[DEBUG] (f) generatedSourcesDirectory = C:\simpletest\target\generated-sources\annotations
[DEBUG] (f) mojoExecution = org.apache.maven.plugins:maven-compiler-plugin:3.1:compile {execution: default-compile}
[DEBUG] (f) optimize = false
[DEBUG] (f) outputDirectory = C:\simpletest\target\classes

如果再用mvn compile -Pproduction -X 查看输出结果。
结果可能是下面的

注意看debugoptimize的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-compiler-plugin:3.1:compile' with basic configurator -->
[DEBUG] (f) basedir = C:\simpletest
[DEBUG] (f) buildDirectory = C:\simpletest\target
[DEBUG] (f) classpathElements = [C:\simpletest\target\classes]
[DEBUG] (f) compileSourceRoots = [C:\simpletest\src\main\java]
[DEBUG] (f) compilerId = javac
[DEBUG] (f) debug = false
[DEBUG] (f) encoding = UTF-8
[DEBUG] (f) failOnError = true
[DEBUG] (f) forceJavacCompilerUse = false
[DEBUG] (f) fork = false
[DEBUG] (f) generatedSourcesDirectory = C:\simpletest\target\generated-sources\annotations
[DEBUG] (f) mojoExecution = org.apache.maven.plugins:maven-compiler-plugin:3.1:compile {execution: default-compile}
[DEBUG] (f) optimize = true
[DEBUG] (f) outputDirectory = C:\simpletest\target\classes

可以看出当用-P指定profile中的id时,如production,会用profile中的配置替换默认的配置。

配置激活

Maven Profile 可能通过profile/activation元素按当前编译环境进行激活,如:

  • JDK版本
  • 环境变量
  • 操作系统设置
  • 目前的或丢失的文件

一些例子如下:
pom.xml

1
2
3
4
5
6
7
8
9
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
...
</profile>
</profiles>

上面的意思就是默认激活dev

pom.xml

1
2
3
4
5
6
7
<profile>
<id>include-script</id>
<activation>
<jdk>1.6</jdk>
</activation>
...
</profile>

当jdk版本是1.6时,激活include-script

pom.xml

1
2
3
4
5
6
7
8
9
10
11
<profile>
<id>win-build</id>
<activation>
<os>
<name>Windows 7</name>
<family>Windows</family>
<arch>x64</arch>
</os>
</activation>
...
</profile>

当在windows下编译时激活win-build

pom.xml

1
2
3
4
5
6
7
8
9
<profile>
<id>debug</id>
<activation>
<property>
<name>debug</name>
</property>
</activation>
...
</profile>

${debug}有定义时,debug激活

pom.xml

1
2
3
4
5
6
7
8
9
<profile>
<activation>
<file>
<exists>target/generated-sources/foo</exists>
<missing>target/generated-sources/bar</missing>
</file>
</activation>
...
</profile>

当foo存在,bar不存在时,激活

总结

按不同的条件进行不同的数据流,是各程工上常见的问题。
比如c/c++有专门的条件编译语句。#define,#if

参考

http://maven.apache.org/guides/introduction/introduction-to-profiles.html
http://www.codetab.org/apache-maven-tutorial/maven-profiles/
http://blog.csdn.net/xiaojiesu/article/details/51866303