maven · 2022-10-31 0

maven 中指定 java 版本编译

一.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 7javac -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