1. 程式人生 > >Java Web工程轉換為基於Maven的Web工程

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工程大功告成!