最新 IDEA 和 Maven 整合問題和解決

Cris就是我發表於2019-02-20

0. 序

前段時間,閒著沒事將個人電腦上的 IDEA 換成了最新版本,Maven 也更新為最新版本,但是發現 IDEA 和 Maven 的整合時,關於依賴 jar 包的更新出現了問題,這裡簡單記錄一下出現的問題以及解決的方案~

1. 準備

Cris 使用的 IDEA 版本如下(當下最新版本)

最新 IDEA 和 Maven 整合問題和解決

Maven 版本升級成最新的 3.6.0

為了方便問題的展示,這裡 Cris 新建一個平時開發最常用的專案架構 首先新建一個父模組 father

最新 IDEA 和 Maven 整合問題和解決
然後使用 Maven 構建

最新 IDEA 和 Maven 整合問題和解決

最新 IDEA 和 Maven 整合問題和解決
下一步直接 finish 即可

然後選中 father 模組,我們可以以 father 模組作為父模組,新建我們的子模組,每個子模組負責不同的業務

最新 IDEA 和 Maven 整合問題和解決
子模組同樣使用 Maven 構建

最新 IDEA 和 Maven 整合問題和解決
同樣步驟我們再完成一個子模組 最後效果如下圖

最新 IDEA 和 Maven 整合問題和解決
父模組這裡擔任的角色相當於為整個專案做管理(上圖父模組的 src 目錄可以刪除掉),不同的子模組負責不同的業務邏輯 緊接著簡單測試一下,子模組建立一個最基本的類

最新 IDEA 和 Maven 整合問題和解決
發現整個專案搭建很順利 但是問題就出現在引入包的時候

2. 問題概述

實際開發中,我們都是用父模組做依賴包的管理,如下

    <groupId>com.cris</groupId>
    <artifactId>father</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>son1</module>
        <module>son2</module>
    </modules>

    <properties>
        <fastjson.version>1.2.51</fastjson.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
複製程式碼

父模組引入了一個 fastjson 的第三方 jar 包,我們使用 dependencyManagement 標籤為管理 jar 包,關於 dependencyManagementdependencies 標籤的不同,這裡不再贅述,大家可以理解為父模組 dependency 標籤管理的 jar 包,都會被子模組引入;
但是如果是 dependencyManagement 標籤管理的 jar 包則在子模組顯示引入的時候才會被匯入到子模組中,不理解的同學可以 參考

子模組 son1 的 pom.xml 如下

    <parent>
        <artifactId>father</artifactId>
        <groupId>com.cris</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>son1</artifactId>
複製程式碼

最新 IDEA 和 Maven 整合問題和解決

當我們顯示的在子模組引入 fastjson 包的時候,

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
    </dependencies>
複製程式碼

(因為版本由 father 模組控制,子模組就可以不用引入 fastjson 的版本號),我們發現子模組無法引入父模組定義的 jar 包

最新 IDEA 和 Maven 整合問題和解決
Cris 也是第一次碰見這樣的情況,上網搜尋了一些答案,都沒說到點子上,後來更改了 IDEA 中的 Maven 設定才最終解決

3. 解決方案

很簡單,開啟 IDEA 的 Maven 設定

最新 IDEA 和 Maven 整合問題和解決
可以修改為 IDEA 自帶的 Maven

最新 IDEA 和 Maven 整合問題和解決
也可以重新在網上下載老版本的 Maven(例如3.3.9)

最新 IDEA 和 Maven 整合問題和解決

在 son2 子模組的 pom.xml 中同樣引入 fastjson 的依賴

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
    </dependencies>
複製程式碼

可以發現,現在 son1 和 son2 子模組引入來自 father 的 jar 包都成功了

最新 IDEA 和 Maven 整合問題和解決
如果想為 son2 模組的 fastjson 包另外指定版本,可以顯示的指定 version 標籤

最新 IDEA 和 Maven 整合問題和解決

如果想為所有的子模組更換 fastjson 的版本號,只需要在 father 模組中更改即可

    <properties>
        <fastjson.version>1.2.47</fastjson.version>
    </properties>
複製程式碼

我們再看看 son1 模組的依賴

最新 IDEA 和 Maven 整合問題和解決
發現也被改過來了,但是如果 son2 模組指定了 fastjson 的具體版本,那麼優先順序還是子模組的版本號高

例如:修改 son2 模組的依賴

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.51</version>
        </dependency>
    </dependencies>
複製程式碼

即便 father 模組 fastjson 的版本是 1.2.47,son2 模組因為顯示的指定優先順序更高

最新 IDEA 和 Maven 整合問題和解決

4. 總結

  • 工具不要總是想用最新的,否則出了詭異的 bug 還得自己調
  • 網上的解決方案大部分都不靠譜,寫的也很莫名其妙
  • 自己總結的經驗才是最可靠的

相關文章