前面一篇文章中咱們瞭解了html
在myeclipse中新建Maven框架的web項目java
那麼若是咱們原來有一些項目如今想轉成maven項目應該怎麼作呢git
我收集到了三種思路:github
1、新建一個maven項目,把原項目按照新項目的框架移植過去web
2、在原項目的框架上進行修改,把項目目錄結構修改爲maven框架同樣 (詳見:爲已有的web project項目加入maven支持,並使用myeclipse的插件)spring
3、不改動原項目目錄結構,經過pom.xml文件來配置目錄mongodb
我的意見,在原項目上作目錄結構容易出問題,特別是已經有svn信息時,因此我推薦方案一和三。express
本篇先嚐試方案一。apache
我原有一個ipFilter項目,如今已經新建好了maven框架的web項目ipFilterM (x詳見:在myeclipse中新建Maven框架的web項目)json
ipFilter的目錄結構如圖:
![](http://static.javashuo.com/static/loading.gif)
ipFilterM的目錄結構如圖:
![](http://static.javashuo.com/static/loading.gif)
在pom.xml中添加依賴包的配置
在ipFilter項目中依賴了不少包,如圖:
![](http://static.javashuo.com/static/loading.gif)
咱們要把這些依賴包配置到pom.xml文件中
未配置前pom.xml的內容以下:
配置方法詳見:
myeclipse中運用maven自動下載包
添加一個咱們本身的包後,發現ipFilterM項目中自動生成了maven的依賴library,裏面就有咱們新添加的包
![](http://static.javashuo.com/static/loading.gif)
在添加過程當中,每點擊一次保存,都會自動從中央庫下載依賴包,若是項目出現了紅色感嘆號,則說明 某個包的依賴與已有的依賴衝突或者重複了,刪除該依賴保存便可回覆正常
有X號可是沒有報錯信息,則說明 某個包在中央庫下載不到,座標不對,這時候嘗試換換版本號可回覆正常
依次把ipFilter的依賴包添加完,pom.xml以下:
將java類移植
接着,我將幾個要用的java類新建在ipFilterM的src/main/java中,下面的圖片分別是兩個項目對應文件夾的目錄圖。
直接把相關文件夾複製過去便可:
移植完後,maven install 一下,則會在target路徑下生成war包
至此,咱們的項目就移植完了。
解決包的衝突
但此時的war包直接複製到tomcat的webapp路徑下 啓動並不可用
Maven對於新手來講,最痛苦的一件事莫過於包之間的衝突,因爲Maven的依賴傳遞性,當你引入一個依賴類時,其身後的依賴類也一塊兒如過江之鯽紛至沓來了。
舉例來講
A依賴於B及C,而B又依賴於X、Y,而C依賴於X、M,則A除引B及C的依賴包下,還會引入X,Y,M的依賴包(通常狀況下了,Maven可經過<scope>等若干種方式控制傳遞依賴)。
這裏有一個須要特別注意的,即B和C同時依賴於X,假設B依賴於X的1.0版本,而C依賴於X的2.0版本,A究竟依賴於X的1.0仍是2.0版本呢?
這就看Classloader的加載順序了,假設Classloader先加載X_1.0,而它就不會再加載X_2.0了,若是A偏偏但願使用X_2.0呢,血案就這樣不期而遇了。
要想項目成功運行,咱們還要解決包的衝突問題。
咱們在myeclipse的pom視圖能夠看到衝突的狀況
解決的方法是隻保留一個最高級的包,其餘的低級包找到它的上級包 添加<exclusions>把低級包排除出去
- <!--若是你的工程是用maven管理的話,能夠在commons-logging的依賴裏把servlet-api-2.3去除掉,再加入你所須要的版本的servlet-api依賴。大概的例子以下: -->
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1.1</version>
- <exclusions>
- <exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
-
- <dependency>
-
-
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>servlet-api-2.5</artifactId>
- <version>6.1.14</version>
- <scope>provided</scope>
- </dependency>
- <!-- 指定scope爲provided能夠避免在發佈的時候把servlet-api包拷到lib目錄下。 -->
詳情可參考:
後續請看:
maven項目如何啓動運行---發佈到tomcat中
在myeclipse中啓動maven項目
對比新舊工程的lib包
處理完衝突後,咱們就能夠maven install生成war包了。
但,放在tomcat中每每仍是會報不少錯,這顯然是缺乏包的現象。
咱們這時候就要對比解壓出來的新工程和舊工程中lib的包的狀況
多了的,要設置成provideed
少來的,要補上
當包數量和個數如出一轍時,咱們離成功又進了一步。
檢查生成的工程中class
檢查生成的工程是否包含了 咱們的spring.xml和struts.xml文件
若是包的數量已經如出一轍了,可是啓動仍是不少錯誤。
只有一個緣由
就是打war包是 spring.xml等文件沒加載進class中
咱們能夠比較一下生成的maven工程和舊工程之間的區別
這時候咱們要對xml文件夾設置一下路徑
對着項目右鍵
Properties--->MyEclipse--->Deployment Assembly 把resource的文件夾輸出路徑設置成跟 src/main/java同樣便可
刷新項目,這時候打war包,運行。
終於改版完成!
啓動不報錯,並且頁面訪問也能夠用了。
最終的pom.xml以下: