1. 程式人生 > 實用技巧 >關於 maven-compiler-plugin 外掛的使用詳解

關於 maven-compiler-plugin 外掛的使用詳解

兩種方式

maven 專案是通過 maven-compiler-plugin 外掛來對 Java 程式碼編譯的,如果不指定 JDK 版本,maven-compiler-plugin 會自動使用一個預設的版本,該版本可能與你使用的 IDE 所使用的 JDK 版本不一致,這種情況可能會導致程式碼無法通過 maven 的編譯,例如:在 IDE 指定 JDK 1.8 ,coding 的時候使用了JDK 1.8 的特性,而 maven-compiler-plugin 預設的 JDK 版本為 1.5,此時 JDK 1.5 是不可能將帶有 JDK 1.8 特性的程式碼編譯通過的。此類問題的出現可通過在 pom 檔案中指定 JDK 版本來避免,有如下兩種方式:

  1. 方式一
    <properties>
        <!-- maven-compiler-plugin 將會使用指定的 JDK 版本將 java 檔案編譯為 class 檔案(針對編譯執行環境) -->
        <maven.compiler.target>1.8</maven.compiler.target>
        <!-- maven-compiler-plugin 將會使用指定的 JDK 版本對原始碼進行編譯(針對編譯執行環境) -->
    	<maven.compiler.source>1.8</maven.compiler.source>
    <properties>
  1. 方式二
<build>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.8.0</version>
               <configuration>
                   <!-- 同【方式一】的 maven.compiler.target -->
                   <source>1.8</source>
                   <!-- 同【方式一】的 maven.compiler.source -->
                   <target>1.8</target>
               </configuration>
           </plugin>
       </plugins>
   </build>
  1. 方式三

    首先要先說明一下,該方式並非 Maven 官方配置,要使該方式能夠生效首先必須滿足以下兩個條件:

  • 專案為一個 SpringBoot 工程
  • 專案的 POM 繼承了 spring-boot-starter-parent注:以2.1.3.RELEASE版本為例
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>
    <properties>
        <java.version>1.8</java.version>
    </properties>
</project>    

如上邊的程式碼片段,只要指定 java.version 就等同於指定了maven.compiler.target、maven.compiler.source,那麼問題就來了!!!

  • java.version 並非 Maven 官方配置,那做到這一點的肯定就不是 Maven 了,那會是誰呢?!

  • 確定了是誰,那 TA 又是如何實現的呢?!

    要想找到以上問題的答案,先看下圖:

    通過上邊的截圖,答案很明顯了吧,該截圖是 spring-boot-starter-parent POM 檔案的片段,java.version 是 spring-boot-starter-parent 自定義的 properties,而 maven.compiler.target、maven.compiler.source 都依賴於 java.version,所以設定了 java.version 也就等同於同時設定了maven.compiler.target、maven.compiler.source。

相關問題

  1. IntelliJ IDEA 裡面 Maven 外掛,如果 pom.xml 裡面沒有指定 JDK 版本,那麼 IntelliJ IDEA 將預設使用 1.5 版本進行編譯。此時, IntelliJ IDEA 編譯時就會出現如下警告:

Warning:java: source value 1.5 is obsolete and will be removed in a future release

或者

Warning:java: 源值1.5已過時, 將在未來所有發行版中刪除

要解決這個問題,除了上述的【方式一】【方式二】,就只能通過手動設定來更改預設的版本,如下圖:

2. 如果你的 project 是一個 SpringBoot,且 POM 繼承了 spring-boot-starter-parent(這裡以 2.1.3.RELEASE 為例),那麼可以先檢視一下 spring-boot-starter-parent 中的 pom.xml,在 父POM 裡已對 maven.compiler.target、maven.compiler.source、project.reporting.outputEncoding、project.build.sourceEncoding、java.version 進行了設定,如果已滿足你的需求,則不需要再在 子POM 裡再次設定進行覆蓋了,如下圖:

3. 如果你的 project 是一個 SpringBoot,且 POM 繼承了 spring-boot-starter-parent(這裡以 2.1.3.RELEASE 為例),在 子POM 和 父POM 中是無法找到 maven-compiler-plugin 外掛裝載的配置(即 … 中不存在此外掛的配置),但該 project 確實實在在地可以使用此外掛,這是為什麼呢?我們可以在 IDEA 中開啟 子POM,在 子POM 編輯域內,右鍵選擇 Maven -> Show Effective POM ,如下圖:

在新開的視窗內,可以在…中找到 maven-compiler-plugin 外掛關於裝載的配置,如下圖:

原文連結:https://blog.csdn.net/yangchao1125/article/details/100585116