1. 程式人生 > >Maven編譯多子專案依賴

Maven編譯多子專案依賴

早在某公司實習的時候就聽聞過Maven,只是聽大神簡單的介紹過,自己沒有實習做過。之前做Android 的時候主要是用gradle(不過真心不熟),大概有點知道Maven的作用,這次來深圳某公司實習,老闆叫用Maven 編譯C++,雖然事實證明老闆的想法有點錯誤,不過也基於這個,還是稍微正規的學了一發Maven(當然是自學了,除了C++其他都是自學的)。

Maven簡介

Maven其實主要就是解決專案編譯和專案依賴的問題,在大型專案中很有優勢。

例如你的一個專案中有幾十外部依賴包,和你自己寫的一些包,如果是不用Maven這種東西的話,你得一個一個包的下載,這樣比較效率低下,而且一旦你用的包有更新,你又要重新去下載,可能在小專案中這倒沒什麼,但是在正規的大專案中,外部包的更新換代對專案還是有很大的影響,如果一個外部包有漏洞,可能給黑客攻擊的機會,這個時候就必須得更新包。

所以Maven就應運而生,在Maven中只要在一個pom檔案中,做一些配置,就可以自動下載所需要的依賴包到本地倉庫,然後多個專案可以共享本地倉庫的依賴包。如果依賴包需要更新的時候,只需要改一下版本號,就可以了。而且Mavenpom是每個專案(模組)都會有,這些pom中可以有繼承的關係,所以有一些依賴包只要在一個parent裡面定義就可以了,而且在子pom中也可以自己覆寫父pom的定義。

這裡只是簡單介紹一下Maven的一些概念,關於安裝Maven網路上已經有很多教程了,這裡就不重複造輪子了,還有Maven的詳細原理,這裡就給一些自己學習過程的中一些資料:

Maven Linux上部署專案 

Maven多專案構建

 下面介紹一下在網上沒有的東東,在WindowsIntellij裡面部署一個多專案Maven的過程以及踩過的坑。

注意:這裡介紹的多專案是一個大專案下包括多個子專案,本身大專案中的pom是起到配置作用,不生成jarwar檔案,執行在Main專案中,Main專案中呼叫Part1Part2兩個專案中的函式

首先新建一個Maven專案,取名MavenProject生成的時候不要用模板(如果是自己的專案有一定型別可以用模板,這裡只是一個教程,所以沒有用模板)。然後生成之後刪掉scr資料夾。然後再新增三個模組,取名MainPart1Part2groupID繼承

MavenProject的,artifactID自己寫。然後這個時候目錄是這樣的


然後就可以再main(是main不是Main)資料夾裡面的java資料夾裡面寫程式碼,但是這個第一個坑來了,如果你點選那個java右鍵新增,裡面沒有java class的選項,即使你添加了file,字尾是java,也不行,我找了好久都沒找到解決方法,一直以為是配置出問題了,結果這裡是IDE的鍋,這裡要去file -> project structure-->module裡面設定一下,這個時候就要一個一個的mark as,然後就可以正常些程式碼了,這個坑找了好久的問題。

 

寫好程式碼,如下圖 

main.java

 

Part1.java

 

Part2.java

 

由於這裡是Main要引用到part1part2中的東西,所以在mainpom裡面配置一下依賴,part1和part2中的pom由於並沒有依賴,所以用自動生成的就可以了

 

這樣就會引用到這兩個庫了,可以在右邊的一個控制板中看到(那個九十度倒著的M字樣,如果是intellij中的),記得重新整理一下

 

然後這個時候點Maininstall就可以了,也可以用mvn install的命令

 

Maven依賴包打包生成

這個時候在main裡面的target就會生成一個jar包,然後你一執行就會發現,clssNotFound,因為maven打包預設不會把依賴包打進去,找到不到依賴的part1和part2。所以這裡就是第二坑,這裡在網上查各種複雜的方法,一堆麻煩,而且我也一直以為不用外掛,只需要配置一下就可以了,一直沒找到。後來找到一個網站,那個配置方法很簡單,不過還是用了外掛

 

在pom加上這段就行了,會下載一個外掛,貌似公司的專案把依賴包打進去也是用這個,maven官方出的外掛,值得信賴。

最後當然就是搞定咯,但是花了一下午…….

因為前人,才能更高

3.Maven 打包依賴包生成目標檔案 http://lvjun106.iteye.com/blog/1849803 

4.Maven 編譯C/C++外掛 http://blog.bigpixel.ro/2012/07/building-cc-applications-with-maven/  (本文中沒有提及這個連結,但是這個可以作為用Maven編譯C/C++的一個思路,但本人通過查閱其他資料,以及個人理解還是建議,編譯C/C++不用該用maven,儘管是Java和C/C++混合程式設計,編譯C/C++可以用GCC,或者makefile更加合適,至於用法可參見本人上一篇部落格)