前言
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插件时,都不需要进行特殊配置,默认的配置已经够用了,但一些特殊项目想要进行特殊化编译,就可以通过配置来完成。
夜雨聆风