關於 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM