1. 程式人生 > >maven項目 在eclipse,InteliJ IDEA中的一些問題

maven項目 在eclipse,InteliJ IDEA中的一些問題

tar log style nbsp lips spa 應該 自動 efault

轉載請註明出處,謝謝!

不論我們用什麽ide來編輯我們的代碼,最終的產品都會脫離ide來運行;正如燕飛離了巢,正如你離開了家,不期然就會運轉出現問題。

- 單強 2018年1月26日11:53


大家是否也思考過:

問題1:maven項目在eclipse中正常運行,但是到了InteliJ IDEA中卻空指針?報錯?

問題2:為什麽src/test/java中的代碼可以import src/main/java中的類,反之則不行?

解答1:各ide的編譯規則不同。

解答2:maven的生命周期決定的。

解決根源的處理方案:放下ide,關註maven本身,回到maven根目錄下執行maven命令(雖然ide已經集成了部分maven命令)。


看到了我的解答,正在瀏覽本網頁的你可能已經get到了我的點;但本著做事有始有終的原則,我還是要繼續下去:

默認情況下(熟練使用的朋友們可更改編譯時機):

eclipse保存時編譯 簡記為-> Ctrl S

InteliJ IDEA運行時編譯 簡記為-> Runtime

這就決定了在編譯工作上,InteliJ IDEA是更向maven靠攏的(實際上InteliJ IDEA的編譯也不完全符合maven的規範)。

我們可以用mvn help:effective-pom命令來看一下,下圖只截取compile與test-compile部分
技術分享圖片

可以看出,maven的編譯順序是先編譯src/main/java,後編譯src/test/java;

這便解釋了問題2 -> src/test/java中的代碼可以import src/main/java中的類,反之則不行;因為src/test/java中的類還未被編譯,所以不能import,否則會報錯。

但是如果使用eclipse編輯的話,src/main/java中的代碼是可以引用src/test/java中的類的,原因已在上面給出,不再贅述(沒有找到的朋友們歡迎留言)。


以上述說了eclipse編輯maven項目時的弊端,InteliJ IDEA的同學們不要幸災樂禍,我這就舉一個InteliJ IDEA編輯maven時檢查不到的錯誤。

技術分享圖片

src/main/java下的類

技術分享圖片

使用junit3,因為是在我創建maven時自動生成的,所以就用了,習慣用@Test註解的同學可以導入junit4+的包;

技術分享圖片

目錄結構以及App,AppTest中的代碼如圖所示,可以看到在src/test/java目錄下的AppTest引入了App對象。

到此一切都沒有什麽不一樣;

下面我們在pom.xml中添加以下代碼:(覆蓋掉effective-pom中執行編譯的部分)

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <executions>
        <execution>
            <id>default-compile</id>
            <phase>clean</phase>
            <goals>
                <goal>help</goal>
            </goals>
        </execution>
        <execution>
            <id>default-testCompile</id>
            <phase>test-compile</phase>
            <goals>
                 <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
</plugin>            

我們可以看到InteliJ IDEA並沒有什麽異常,運行測試用例,發現運行正常,並且target目錄下生成了對應的四個目錄,這是IDEA的Runtime時自動編譯的:

技術分享圖片

我們再執行:mvn clean test-compile

技術分享圖片

報錯:

技術分享圖片

此時,由於我們修改了pom.xml文件,導致編譯階段src/main/java中的代碼並沒有被編譯,在src/test/java中的代碼也就訪問不到src/main/java中的類。

IDEA自帶的編譯效果宣布與maven的要求不匹配,IDEA不會去關心pom.xml中的plugin來編譯。


結論:maven的項目最終還是要回歸到maven命令來進行編譯的,所以不要依靠ide的編譯;轉移或發布之前請執行mvn clean package,如果success,那麽恭喜,此份代碼放在任何一款ide下都會正確的運行(所以朋友們就不要再問為什麽我的代碼在eclipse中能正常運行,而InteliJ IDEA中卻不能運行了,通過本文你應該知道,即使在IDEA中能正常運行,也未必就符合maven的意圖)。

maven項目 在eclipse,InteliJ IDEA中的一些問題