前言

Java项目要运行,必须要经过编译过程,就是将我们的源代码编译成jvm平台的字节码才能真正运行起来。如果我们使用命令行来操作就要使用javac命令,这个命令来生成字节码,然后再使用java命令来运行。虽然在Java8以后可以直接通过Java命令来操作,但是其内部还是必须先编译字节码。
但使用maven编译Java项目时,maven-compiler-plugin是默认的编译插件,我们可以理解为maven-compiler-plugin插件做了javac的工作,而且通过配置能实现自由编译我们的源代码。


一、使用方式

默认情况下,我们在pom.xml里面可以不配置这个插件,但如果要自定义一些编译步骤,配置如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5.1</version>
    <configuration>
        ...
    </configuration>
    <executions>
        ...
    </executions>
</plugin>

版本号根据自己项目环境来设置,当然也可以不设置版本号,maven会自己去寻找合适的版本

二、常用配置详解

编译配置主要是configuration标签,完整的配置如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <verbose>true</verbose>
        <fork>true</fork>
        <executable>${JAVA_HOME}/bin/javac</executable>
        <meminitial>128m</meminitial>
        <maxmem>512m</maxmem>
        <compilerVersion>1.8</compilerVersion>
        <source>1.8</source>
        <target>1.8</target>
        <compilerArgs>
            <arg>-verbose</arg>
            <arg>-Xlint:all,-options,-path</arg>
        </compilerArgs>
    </configuration>
</plugin>

1.verbose

这个参数表示输出编译的详细细节,方便了解编译的具体情况

2.fork、executable

这两个参数一般会搭配使用,如果省略executable并设置true,maven编译器插件将默认选择JAVA_HOME/bin/javac二进制文件,如果设置了false,maven编译器插件将通过ToolProvider接口选择编译器。这意味着不会启动新进程,Maven正在运行的JavaVM也会进行编译。
executable表示javac的绝对路径,默认会寻找环境变量JAVA_HOME的位置,当前也可以自己设置一个路径。

3.meminitial、maxmem

设置编译时的最小内存和最大内存

4.compilerVersion

设置编译时jdk的版本信息

5.source、target

设置编译的源代码和目标代码的语言级别,特别是在jdk8以后的版本中,每个Java版本的语法会有差异,在这里可以精确指定。
这两个属性还可以通过配置pom.xml全局属性来完成,配置如下:

<project>
  [...]
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  [...]
</project>

这两个属性也可以使用release属性来代替,release属性需要高版本的maven-compiler-plugin才行。具体配置如下:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.12.1</version>
  <configuration>
    <release>8</release>
  </configuration>
</plugin>

或者设置pom.xml全局属性:

<project>
  [...]
  <properties>
    <maven.compiler.release>8</maven.compiler.release>
  </properties>
  [...]
</project>

6.compilerArgs

这里可以设置编译时的属性,和使用javac命令一样。

三、使用外部编译器

正常情况下,我们编译Java代码时,都会使用我们本机安装的javac命令,当然我们也可以不使用本机的javac来进行编译。可以借助Plexus Compiler组件来编译Java项目,Plexus Compiler是一个编译套件,类似于gcc/clang等编译器。可以编译Java代码,甚至可以来编译C#的代码,具体的组件介绍点击官网可以查看详细文档。比如下面我们使用Plexus Compiler来编译Java代码:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.12.1</version>
  <configuration>
     <fork>false</fork>
    <compilerId>javac</compilerId>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-compiler-javac</artifactId>
      <version>1.6</version>
    </dependency>
  </dependencies>
</plugin>

这里我们需要使用compilerId标签和fork标签配合

四、jdk9+版本兼容编译

如果我们的代码是在jdk9+的环境中开发,但是又想兼容jdk9以下的版本,那么就需要配置兼容编译,兼容编译其实就是需要调用javac两次。

  1. module-info.java 必须使用 release=9 进行编译
  2. 其余的源必须使用较低的预期兼容性版本的源/目标进行编译。

具体配置如下:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.12.1</version>
  <executions>
    <execution>
      <id>default-compile</id>
      <configuration>
        <release>9</release>
      </configuration>
    </execution>
    <execution>
      <id>base-compile</id>
      <goals>
        <goal>compile</goal>
      </goals>
      <configuration>
        <excludes>
          <exclude>module-info.java</exclude>
        </excludes>
      </configuration>
    </execution>
  </executions>
  <configuration>
    <release>6</release>
    <jdkToolchain>
      <version>9</version>
    </jdkToolchain>
  </configuration>
</plugin>

上面的配置只能兼容jdk6/7/8,如果还要兼容jdk5,配置如下:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.12.1</version>
  <executions>
    <execution>
      <id>default-compile</id>
      <configuration>
        <release>9</release>
        <jdkToolchain>
          <version>9</version>
        </jdkToolchain>
      </configuration>
    </execution>
    <execution>
      <id>base-compile</id>
      <goals>
        <goal>compile</goal>
      </goals>
      <configuration>
        <excludes>
          <exclude>module-info.java</exclude>
        </excludes>
      </configuration>
    </execution>
  </executions>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
    <jdkToolchain>
      <version>[1.5,9)</version>
    </jdkToolchain>
  </configuration>
</plugin>

总结

大部分情况下,使用maven-compiler-plugin插件时,都不需要进行特殊配置,默认的配置已经够用了,但一些特殊项目想要进行特殊化编译,就可以通过配置来完成。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐