一.maven 与 jdk 版本的关系
高版本 jdk 运行 maven,是可以打出低版本的 java 目标二进制文件的。比如用 jdk 1.8 运行 maven,可以编译 1.8,1.7,1.6 等的代码,并输出相应版本的二进制文件。
用低版本的jdk运行maven,是不可能输出高版本的JAVA二进制文件的。
可以使用 mvn -version
,查看 maven 版本,和 maven 使用的 jdk 版本。
可以向低版本编译,例,javac -d foo1/ Test1.java Test2.java Test.java -encoding UTF-8 -source 7 -target 7
或 javac -d foo1/ Test1.java Test2.java Test.java -encoding UTF-8 --release 7
虽然说 Java 的向后兼容做得非常非常好, 但是也不是100%兼容,特别是高版本没有 javax 包。
比如,源代码使用 javax.xml.bind.JAXBException
类,使用 jdk11 编译成 jdk7,会编译失败
--release
参数是 jdk 9 开始支持的
二、编译成指定版本
1.pom.xml 的 properties
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
maven-compiler-plugin 3.6
及以后的版本提供了一种新的方式: org.apache.maven.plugins maven-compiler-plugin 3.8.0 9
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
如果它不起作用,因为您使用的 maven-compiler-plugin 默认版本不依赖于足够新的版本
2.pom.xml 插件
2.1不指定运行的 jdk
如果 maven 使用的是 jdk11,想要把源码编译成 8,可以配置 maven-compiler-plugin
插件,指定要编译的版本。
实际在编译的时候,在 jdk11 环境,运行 javac <source> -encoding UTF-8 -source 1.8 -target 1.8
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
使用 mvn package -X
可以看到 debug 日志:
[DEBUG] Classpath:
[DEBUG] /home/zxm/IdeaProjects/jdk8-demo/target/classes
[DEBUG] Source roots:
[DEBUG] /home/zxm/IdeaProjects/jdk8-demo/src/main/java
[DEBUG] Command line options:
[DEBUG] -d /home/zxm/IdeaProjects/jdk8-demo/target/classes -classpath /home/zxm/IdeaProjects/jdk8-demo/target/classes: -sourcepath /home/zxm/IdeaProjects/jdk8-demo/src/main/java: -s /home/zxm/IdeaProjects/jdk8-demo/target/generated-sources/annotations -g -nowarn -target 8 -source 1.8 -encoding UTF-8
2.2 指定运行的 jdk
如果 maven 使用的是 jdk11,想要使用 jdk8 编译,把源码编译成 8,可以在 maven-compiler-plugin
插件指定 javac。
实际在编译的时候,使用的是 /opt/jdk1.8.0_341/bin/javac
,运行 javac <source> -encoding UTF-8 -source 1.8 -target 1.8
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerVersion>1.8</compilerVersion>
<fork>true</fork>
<executable>/opt/jdk1.8.0_341/bin/javac</executable>
</configuration>
</plugin>
</plugins>
使用 mvn package -X
可以看到 debug 日志:
[DEBUG] Classpath:
[DEBUG] /home/zxm/IdeaProjects/jdk8-demo/target/classes
[DEBUG] Source roots:
[DEBUG] /home/zxm/IdeaProjects/jdk8-demo/src/main/java
[DEBUG] Excutable:
[DEBUG] /opt/jdk1.8.0_341/bin/javac
[DEBUG] Command line options:
[DEBUG] -d /home/zxm/IdeaProjects/jdk8-demo/target/classes -classpath /home/zxm/IdeaProjects/jdk8-demo/target/classes: -sourcepath /home/zxm/IdeaProjects/jdk8-demo/src/main/java: /home/zxm/IdeaProjects/jdk8-demo/src/main/java/com.example/Main.java -s /home/zxm/IdeaProjects/jdk8-demo/target/generated-sources/annotations -g -nowarn -target 8 -source 1.8 -encoding UTF-8