关于maven打包与jdk版本的⼀些关系
最近让不同JAVA版本的容器maven打包折腾的不⾏,终于理出了⼀点头绪。在这⾥记录下备忘。
1. Maven与jdk版本的关系
先明确⼀个概念,关⾼版本JDK运⾏maven,是可以打出低版本的JAVA⽬标⼆进制⽂件的。⽐如⽤jdk 1.8运⾏maven,可以编译1.8,1.7.1.6等的代码,并输出相应版本的⼆进制⽂件。
当然,⽤低版本的jdk运⾏maven,是不可能输出⾼版本的JAVA⼆进制⽂件的。
另外:maven⽤哪个版本的JDK运⾏,取决于环境变量JAVA_HOME指向的是哪个版本。
2. 如何⽤Maven打出不同版本的JAVA⼆进制⽂件
我们可以在项⽬内的l和全局配置l内配置:如何配置maven环境变量
2.1 项⽬内的l内定义:
<build>
<finalName>test-project</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
上⾯的配置就定义了通过jdk 1.8来构建
2.2 maven全局配置⽂件
在maven全局配置⽂件l内配置:
<settings>
<profile>
<profile>
<id>jdk-1.8</id> <!-- profile 名 -->
<activation>
<activeByDefault>false</activeByDefault> <!-- 此profile是否活动 -->
<jdk>1.8</jdk> <!-- jdk版本 -->
</activation>
<properties>
<mavenpiler.source>1.8</mavenpiler.source>
<mavenpiler.target>1.8</mavenpiler.target>
<mavenpilerpilerVersion>1.8</mavenpilerpilerVersion>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</profile>
<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<mavenpiler.source>1.7</mavenpiler.source>
<mavenpiler.target>1.7</mavenpiler.target>
<mavenpilerpilerVersion>1.7</mavenpilerpilerVersion>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>jdk-1.7</activeProfile> <!-- 这个参数是定义活动的profile -->
</activeProfiles>
</settings>
上⾯的配置是通过定义根据使⽤不同的jdk来选择不同的打包⽅案。
那么定义的profile如何使⽤呢?可以使⽤-P参数来指定。
mvn package -P jdk-1.7
3. 全局配置中profile的激活
3.1 使⽤activeByDefault激活
<id>jdk-1.7</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.7</jdk>
</activation>
3.2 使⽤activeProfiles激活
<activeProfiles>
<activeProfile>jdk-1.7</activeProfile> <!-- 这个参数是定义活动的profile -->
<activeProfile>jdk-1.8</activeProfile>
</activeProfiles>
当定义了多个profile为激活的时候,它是根据profile定义的先后顺序来进⾏覆盖取值的,然后后⾯定义的会覆盖前⾯定义的。3.3 使⽤-P参数激活
使⽤-P参数来激活。
mvn package -P jdk-1.7
4. profile的⽣效顺序
全局配置l内定义的激活的profile会优先于项⽬内的l。
1. 如果l 配置<activeByDefault>true</activeByDefault>,并且pom中maven-compiler-plugin 未指定版本则优先⽣效;
2. 如果l 配置<activeByDefault>false</activeByDefault>,并且pom未指定target,则根据环境变量JAVA_HOME⽣效;
3. 如果 l 中的 maven-compiler-plugin 指定版本则优先⽣效;
4. maven(ver 3.3.x)默认target 版本是1.6;
5. 运⾏的maven 的 JAVA_HOME 版本要 >= ⽣效的target版本;
6. 可以使⽤mvn help:active-profiles来查看哪些profile处于激活状态
5. 包依赖问题
有时候经常会发⽣包不对的问题,可以⽤以下命令查看项⽬的包依赖。
mvn dependency:tree