Java Web工程轉換為基於Maven的Web工程
1. 背景
最近接到通知,阿里集團統一要求把歷史專案遷移到阿里生產環境中來,而咱手頭這個專案是2012年的老專案,普通java web工程,不能部署進生產環境,得把這個工程轉為maven工程。本篇文章記錄了java web工程轉為maven工程的整個紀錄。
2. 前期準備工作
2.1. 建立maven web工程
首先建立maven project專案,點選next按鈕
然後勾選上Create a simple project (skip archetype selection)—不使用原型骨架。點選next按鈕
Packaging方式選擇war,點選finish按鈕
由於打包方式為war,所以main目錄下多了一個webapp目錄
由於我們的專案要使用eclipse釋出到tomcat下面,這裡我們需要先把專案轉成dynamic web project
在我們的專案上點選右鍵,選擇properties 並找到 Project Facets ,並點選Convert to faceted form… ,然後勾選Dynamic Web Module 如下圖:
結果提示jdk要求java 1.6以上,回頭看看maven專案的jdk版本是1.5的,如下圖:
我們將其改為1.6,點選OK,同時將JRE library改為1.7,如下圖:
同時把圖中的java 1.4改為1.7,勾選Dynamic Web Module,點選OK按鈕
來看下目前的專案結構,發現多了一個WebContent目錄,但這不符合maven專案結構,因此還需要調整。
把WebContent中的兩個目錄WEB-INF和MATE-INF拷貝進web app目錄裡面,然後刪除WebContent目錄
那麼現在的目錄結構為
然後我們要修改釋出規則,右鍵點選專案, 選擇 Deployment Assembly
選擇WebContent,把它remove掉,測試類我們也不需要釋出,test的兩個目錄頁可以remove
接著重新指定一個web的路徑,點選add
選擇Folder –> next
在src下找到webapp目錄,然後finish
最後一步,我們要把當前的build path 指向 Maven Dependency, 直接點選add,選擇Java Build Path Entries 然後next
然後再點選finish完成
點選OK,結束。到目前為止,一個maven web專案搭建完成
2.2. Java Web工程相應資料夾拷貝至maven工程相應資料夾
首先來看看java web工程的結構
2.2.1. 拷貝java檔案
把java web工程 Java Resources目錄下的src目錄下的java檔案都拷貝到maven工程中的Java Resources目錄src/main/java目錄下面
2.2.2. 拷貝配置檔案
把java web工程 Java Resources目錄下的conf目錄下的xml配置檔案都拷貝到maven工程中的Java Resources目錄src/main/resources目錄下面
2.2.3. 拷貝web檔案
把java web工程 Web Root目錄下所有檔案檔案如下:
把java web工程 Web Root目錄下所有檔案檔案都拷貝到maven工程中的webapp目錄下面
到目前為止,java web專案轉Maven專案的檔案遷移工作全部完成,接下來要做的是個細活,體力活,把java web專案所有引用jar包,都加入到maven pom依賴中來。
3. 新增POM依賴
首先需要去java web專案中檢視都引用了哪些jar包,去java web工程 Java Resources目錄下的Libraries檢視:
上面只是截取了部分,其實很多,有七八十個jar包,這一個個查都得半天。不過除了一個一個查,也沒有其他辦法了。
這裡我就介紹下如何查maven依賴,比如我要查commons-io-2.4.jar對應的maven 依賴
看見結果中有2.4這個版本,點選進去,copy紅框中的結果,將其貼上進pom,其他剩下的就是這樣一個一個查,一個一個新增。
過程中可能會碰到這種情況,在maven官網查不到你需要的那個jar包,這個時候,你需要把這個jar包加入到你的本地庫,或者以後生產環境中的線上庫。
如何加入本地庫,進入你需要新增的jar包所在檔案路徑,然後指定group id和artifactId,如下:
localhost:~ xiaolong$ mvn install:install-file -DgroupId=com.ibatis -DartifactId=ibatis -Dversion=1.0 -Dpackaging=jar -Dfile=ibatis.jar -DgeneratePom=true
其中-Dfile填寫源jar包所在路徑,執行上述命令會自動把jar包新增至你本地的maven倉庫。
4. 過程中碰到的問題
在執行maven工程時會碰到不少問題,大都是maven依賴的引用問題:jar包引用錯誤。
可以通過下面命令來檢查:
mvn clean install
下面是我排除錯誤後,檢查成功的結果:
localhost:BUGManager_maven dddd$ mvn clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building BUGManager_maven 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ BUGManager_maven ---
[INFO] Deleting /Users/xiaolong/Documents/workspace/BUGManager_maven/target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ BUGManager_maven ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 7 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ BUGManager_maven ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 115 source files to /Users/xiaolong/Documents/workspace/BUGManager_maven/target/classes
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/com/autonavi/bugmanager/controller/poi/PoiController.java:[52,27] sun.print.resources.serviceui是內部專用 API, 可能會在未來發行版中刪除
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/com/autonavi/bugmanager/controller/poi/PoiController.java:[53,29] sun.security.provider.MD5是內部專用 API, 可能會在未來發行版中刪除
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/com/autonavi/bugmanager/controller/poi/PoiController.java:[83,55] com.sun.org.apache.xerces.internal.impl.dv.util.Base64是內部專用 API, 可能會在未來發行版中刪除
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/com/autonavi/bugmanager/controller/road/RoadController.java:[70,55] com.sun.org.apache.xerces.internal.impl.dv.util.Base64是內部專用 API, 可能會在未來發行版中刪除
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/test/myTest.java:[13,29] sun.security.provider.MD5是內部專用 API, 可能會在未來發行版中刪除
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/com/autonavi/bugmanager/controller/bus/BusController.java:[55,55] com.sun.org.apache.xerces.internal.impl.dv.util.Base64是內部專用 API, 可能會在未來發行版中刪除
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/com/autonavi/bugmanager/controller/poi/PoiController.java:[1748,68] com.sun.org.apache.xerces.internal.impl.dv.util.Base64是內部專用 API, 可能會在未來發行版中刪除
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/com/autonavi/bugmanager/controller/road/RoadController.java:[3582,68] com.sun.org.apache.xerces.internal.impl.dv.util.Base64是內部專用 API, 可能會在未來發行版中刪除
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/com/autonavi/bugmanager/controller/bus/BusController.java:[597,68] com.sun.org.apache.xerces.internal.impl.dv.util.Base64是內部專用 API, 可能會在未來發行版中刪除
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/com/autonavi/bugmanager/service/common/PageService.java: 某些輸入檔案使用了未經檢查或不安全的操作。
[WARNING] /Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/java/com/autonavi/bugmanager/service/common/PageService.java: 有關詳細資訊, 請使用 -Xlint:unchecked 重新編譯。
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ BUGManager_maven ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ BUGManager_maven ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ BUGManager_maven ---
[INFO]
[INFO] --- maven-war-plugin:2.2:war (default-war) @ BUGManager_maven ---
[INFO] Packaging webapp
[INFO] Assembling webapp [BUGManager_maven] in [/Users/xiaolong/Documents/workspace/BUGManager_maven/target/BUGManager_maven-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [/Users/xiaolong/Documents/workspace/BUGManager_maven/src/main/webapp]
[INFO] Webapp assembled in [945 msecs]
[INFO] Building war: /Users/xiaolong/Documents/workspace/BUGManager_maven/target/BUGManager_maven-0.0.1-SNAPSHOT.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ BUGManager_maven ---
[INFO] Installing /Users/xiaolong/Documents/workspace/BUGManager_maven/target/BUGManager_maven-0.0.1-SNAPSHOT.war to /Users/xiaolong/Documents/repository/m2/repository/com/autonavi/rus/BUGManager_maven/0.0.1-SNAPSHOT/BUGManager_maven-0.0.1-SNAPSHOT.war
[INFO] Installing /Users/xiaolong/Documents/workspace/BUGManager_maven/pom.xml to /Users/xiaolong/Documents/repository/m2/repository/com/autonavi/rus/BUGManager_maven/0.0.1-SNAPSHOT/BUGManager_maven-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.861 s
[INFO] Finished at: 2016-01-23T16:01:10+08:00
[INFO] Final Memory: 34M/285M
[INFO] ------------------------------------------------------------------------
localhost:BUGManager_maven dddd$
出現錯誤後,查詢正確的jar包,即可。
4. maven web執行方式
下面介紹我使用的執行方式:jetty執行。
首先在POM中新增jetty外掛:
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.26</version>
<configuration>
<webAppSourceDirectory>${basedir}/src/main/webapp</webAppSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
在工程上,單擊滑鼠右鍵,點選Rus As—>Maven Build… ,並在Goals中輸入命令:jetty:run
點選RUN,可以成功啟動maven web專案。
到目前為止,Java Web專案轉Maven工程大功告成!