從一個資源文件找不到的問題談IntelliJ IDEA中的Java/Maven項目構建

1.遇到的主要問題

  • 構建一個Maven項目時,無法將resources文件夾中的資源文件打包進構建後的目錄中,具體情況如下圖左邊兩子圖。
    在這裏插入圖片描述
    可見,雖然已將源碼中的resources文件夾Mark Directory As Resources Root,但是構建出的target文件夾中並沒有resources文件夾下的內容,導致後續在Java文件中讀取資源文件找不到(開始一直認爲是讀取的路徑配置不正確,因爲讀取資源文件的API使用的不是JDK中的API而是第三方庫,所以一直糾結是不是第三方庫API讀取資源文件時的默認位置沒指定正確,去查閱API文檔花費了一定時間,後來確認第三方庫讀取位置沒問題後才發現是資源文件根本沒有被打包進編譯後的項目中,也就是說其實是項目構建階段出了問題,而不是代碼運行階段出的問題)。

2.問題分析與解決方案

既然找到了問題所在,那麼就要解決這個構建階段的問題,需要想辦法讓IDEA把resources文件夾下的內容打包進去,在項目配置中翻閱了可配置的屬性,發現除了將resources文件夾Mark Directory As Resources Root以外竟然別無他法,然而這波操作是無效的,還是打包不進去,這裏如果有讀者知道其他的額外配置方法還請評論告知,非常感謝!
後來一直調試了許久依舊不能解決,想着把項目從實驗室拷貝回去再繼續研究,到另一臺電腦上用IDEA導入項目後直接構建,發現問題居然消失了!!資源文件被成功打包進去了,於是思考這是爲什麼,在將兩臺電腦上的項目配置與目錄結構進行仔細對比之後終於發現了問題所在,關鍵就在於上圖所示的藍色方框與紅色方框中的區別,紅色方框內是Maven項目的符號,在新的電腦上導入項目時IDEA進行了Maven項目的檢查,將其識別爲了Maven項目,所以構建成功,而在原來的電腦上由於之前的配置問題導致IDEA沒能識別出項目爲Maven項目,解決方法是在pom.xml上右鍵進行+Add as Maven Project操作,如上圖最右子圖,之後即可使IDEA正確識別Maven項目類型構建成功,問題解決。

3.問題所引發的思考

(1)爲什麼只有在將項目標記爲Maven項目時IDEA才能夠打包resources中的資源文件,而在之前即使把resources文件夾Mark Directory As Resources Root也不行?
我想是因爲src/main/(java,resources,webapp)這種目錄結構是Maven所規定的默認目錄結構,所以在IDEA不知道項目是Maven項目時它就不知道resources文件夾裏面是資源文件,也就是說Mark Directory As Resources Root這波操作只對於Maven項目或其他規定有資源目錄的項目類型是有效果的,對於普通的Java項目是沒用的,要對普通Java項目打包資源文件還需要繼續研究怎麼做,若有讀者知道還請告知。
(2)IDEA的Build Project操作到底爲我們做了些什麼事情?這個操作它又依賴於什麼?
一開始以爲,在將項目標記爲Maven項目後,IDEA會直接調用mvn compile/package指令去編譯與打包項目,後來發現不是的,IDEA的Build與Maven的構建是並列的兩種構建體系,IDEA的Build調用系統中的javac對Java文件進行編譯,並根據用戶配置去打包資源文件,IDEA的Build依賴於其本身的.iml配置文件,裏面存儲了用戶設置的配置信息,IDEA的Build不會去調用Maven的構建指令。Maven的構建則完全依賴於pom.xml文件中的內容,Maven的構建也調用系統中的javac,可通過IDEA的插件功能觸發。
這裏想着重講的一點是二者之間的聯繫,也就是解決這個問題的過程中所發現的,IDEA的Build雖然與Maven構建是互相獨立的,但是IDEA的構建會被項目的類型所影響,它會參考項目的類型來確定項目中哪些文件夾是資源文件,因此將項目標記爲Maven項目會影響到IDEA的Build。

4.總結

(1)代碼運行時出現資源找不到這種類型的問題時,應首先確定是運行階段的問題還是構建階段的問題,再進一步排查;
(2)特定目錄結構(如src/main/java)是特定類型(如Maven)的項目所獨有的,因此要識別這種結構也就必須參考相應的類型信息或額外配置,在未指定類型時IDE就不能做到默認識別了;
(3)IDEA的Build與Maven構建是互相獨立的;
(3)IDEA的構建會被項目的類型所影響,它會參考項目的類型來確定項目中哪些文件夾是資源文件,因此將項目標記爲Maven項目會影響到IDEA的Build。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章