程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 如何用Maven建立Java應用程序

如何用Maven建立Java應用程序

編輯:關於JAVA

 Maven不僅是一個新建工具。如果正確使用,它還能幫助你管理項目及進行配置。下面我們來進行說明。

 在這個系列以前的文章中,我們討論了“開發Swing應用程序”和“用網絡服務功能開發一個混合Swing應用程序”。現在,我們把它們結合起來,討論如何將這些代碼應用到一個能夠配置到服務器上的網絡應用程序中。

 我們主要改變了建立應用程序所使用的方法。之前我們用過Ant,但這次我們換用apache Maven,它具有更強的生命周期導向性,現在已發布第二版。雖然我們用Maven代替Ant,但不要認為Maven只是一個建立工具。它還可通過最佳實踐模式對項目進行管理。如果我們首先安裝Maven,再獲取本月的ToDoTasks源代碼,將會更加方便。

 首先你會發現目錄樹相當簡單。在頂部有一個src目錄和一個pon.XML文件,這個文件即項目對象模型(POM),它保存所有與項目有關的信息。POM文件告訴Maven如何建立一個它所稱的artifact,它有一個名稱,在jar或war文件中稱為組和版本和映射。因此POM最先擁有的是我們正在建立的artifact信息:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

 這是強制性的開端部分。我們打開一個項目元素,然後就會出現一個必需的modelVersion元素,它說明我們正在使用哪個POM版本。現在進入artifact信息。

uk.builder

todotasks

 groupID是一個針對一串artifact的唯一標識符。在上例中,它為uk.builder。artifactID是組中artifact的唯一名稱。它們共同為artifact命名,而非說明它的版本。

2.0-SNAPSHOT

 這是我們的版本。-SNAPSHOT是一個說明“開發中”版本的Maven實例。現在,雖然我們有了項目的工作名稱,我們還需要一個顯示名稱。

ToDoTasks

 在需要顯示artifact的名稱時,Maven將使用這個名稱。現在討論最重要的部分:

war

 之間的元素可以為值jar、war或ear。我們正在建立一個網絡應用程序,所以我們使用war。這不只是說明我們封裝artifact的方法(初看起來是這樣),實際上它影響artifact的整個生命周期。

現在,我們暫停討論POM文件,再來了解src目錄。

src -+-> main -+-> Java -> com -> builder -> uk -> todotasks

||

|+-> webapp -+-> META-INF

||

|+-> WEB-INF

|

+-> test -+-> Java -> com -> builder -> uk -> todotasks

 Maven項目的src目錄在一個主目錄和其它子目錄下保存所有源代碼,java代表Java源代碼,webapp代表網絡應用程序代碼。測試代碼是唯一的例外,它保存在test目錄下的一個平行目錄中。你會發現其中沒有jar文件的庫目錄,這是因為Maven並不需要它。

 Maven根據jar/war/ear文件貯藏庫來考慮問題,每個庫都有各自的組ID,artifact ID和版本,這些文件稱之為artifact。在本地系統中,你擁有自己的貯藏庫,它一般位於主目錄的.m2目錄下。Maven新建一個項目的目的是建立一個artifact,它可以安裝到這個貯藏庫中,以方便其它項目使用。還有遠程貯藏庫,Maven可通過它們獲得artifact拷貝,再把它們安裝到本地貯藏庫中,同樣是為了方便其它項目使用。

 Maven通過pom.XML文件中的另一個區域——依賴區域——來了解需要哪些artifact。

jdbm

jdbm

1.0

這是一個獲取jdbm的簡單依賴。默認情況下,Maven通過訪問http://www.ibibio.ort/maven2/來獲得依賴,如果你查看jdbm/jdbm/1.0/目錄,就會發現jdbm-1.0.jar文件,Maven將恢復它;以及一個簡短的jdbm pom.XML文件,它列舉artifact本身擁有的任何依賴。你可以手動浏覽ibibio貯藏庫或使用MVN Registry這樣的網站來搜索貯藏庫。

 下一個要討論的依賴是dwr,但你在ibibio貯藏庫中找不到它。你必須將它安裝到我們自己的本地貯藏庫中。

dwr

dwr

2.0M3

 下一個依賴為Java Servlet API。在ibibio庫中可以找到它,但我們只有在建立項目的時候才需要它;因為當我們配置一台網絡服務器時,servlet API已經存在。

Javax.servlet

servlet-api

2.4-20040521

provided

 scope說明何時需要這個artifact,因此“provided”說明artifact由運行時間環境提供。另一個scope類型為“test”,它說明只有在測試時需要artifact。例如,我們這樣包括Junit:

junit

junit

3.8.1

test

 現在,Maven項目知道它會需要哪些貯藏庫。我們差不多為新建項目做好准備。Maven還需要了解兩件事:用Java 1.5建立源代碼並運行它。這二步在build塊中完成。

todotasks

 首先,在build塊中是我們希望為代碼取的最終名稱。然後我們為我們希望使用的插件定義設置。插件是Maven擴張自身的方式,你不必安裝它們,只需要使用就行。Maven將從自己的貯藏庫中恢復它們。我們設置的第一個插件是maven編譯器插件。我們只需通過設定兩個設置屬性——源版本和目標版本——告訴它正在編譯Java 1.5代碼。

maven-compiler-plugin

2.0

1.5

1.5

 最後,我們將使用一個叫做Cargo的插件,它把我們建立的網絡應用程序傳送到一個能夠運行它的容器中。

org.codehaus.cargo

cargo-maven2-plugin

現在我們已經為建立項目做好准備。記得Maven的目的是將artifact安裝到貯藏庫中,因此如果我們要它那樣做,它會運行所有必要的步驟。

$ mvn install

 現在Maven要下載許多內容,因為它要從中央貯藏庫提取所有插件和必要的artifact。但是,我們還遺漏了一個artifact——DWR artifact。Maven最終將會出錯,並顯示下面這段內容豐富的錯誤信息:

[INFO] ---------------------------------------------------------------

[ERROR] BUILD ERROR

[INFO] ---------------------------------------------------------------

[INFO] Failed to resolve artifact.

Missing:

----------

1) dwr:dwr:jar:2.0M3

Try downloading the file manually from the project web site.

Then, install it using the command:

mvn install:install-file -DgroupId=dwr -DartifactId=dwr

-Dversion=2.0M3 -Dpackaging=jar -Dfile=/path/to/file

Path to dependency:

1) uk.builder:todotasks:war:2.0-SNAPSHOT

2) dwr:dwr:jar:2.0M3

----------

1 required artifact is missing.

--

 因此我們需要下載DWR2.0M3並把它安裝到貯藏庫中。DWR主網站上沒有DWR2.0M3,你可以訪問Java.Net並在那裡下載dwr.jar文件,然後運行Maven建議的命令。現在我們可以再試著運行安裝。

$ mvn install

 然後會有更多下載,代碼編譯、單元測試運行、網絡應用程序裝配、通過它建立的war文件和安裝到本地Maven貯藏庫的war文件。所有這些工作的結果被存放到新建的目標目錄中。當然,我們希望現在就運行應用程序。這時就要用到cargo插件。在默認情況下,cargo會下載並安裝內置的Jetty 5.x網絡服務器,並運行主war文件。要實現這一點,我們調用cargo的start goal。

$ mvn cargo:start

接著再下載所需的artifact,最終以下列的信息結束:

[INFO] [beddedLocalContainer] Jetty 5.x Embedded started on port [8080]

[INFO] Press Ctrl-C to stop the container...

 打開網絡浏覽器並訪問http://localhost:8080/todotasks/,你會看到todotasks網絡應用程序正在運行。

 我們實際上並沒有寫太多pom.XML文件,但已經有一個建立過程帶我們完成基本的生命周期。如果你查看目標目錄,你還會發現一個surefire-reports目錄,裡面有所有運行單元測試的報告。這不是你唯一能夠生成的內容,試一下Maven的site goal:

$ mvn site

 這生成了一個基於項目的網站模板,存儲在target/site中。如果你打開浏覽器並查看那裡的indext.Html文件,你就會看到它。如果你見過許多apache項目,很明顯這是一個熟悉的布局。在我們的例子中,除了依賴頁面外,我們沒有建立許多頁面,但它足以說明Maven能夠幫助管理各種過程。

代碼有何變化?

 由於我們要建立一個純粹的網絡應用程序,代碼會有相當大的變化。Swing UI類、Main.java和Controller.Java文件都不復存在。現在,刪除那些內容留下一個問題:Tasks對象從何而來?TasksFactory現在增加了一個方法:

private static Tasks currentTasks;

public static Tasks getTasks()

{

if(currentTasks==null)

{

try {

currentTasks=createTasks(TasksType.JDBM);

} catch (IOException ex) {

ex.printStackTrace();

}

}

return currentTasks;

}

它管理基於JDBM的Tasks實例的一個靜態實例。任何時候一個類要引用Tasks,它會調用這個方法,並按需要建立Tasks。

 從DWR出現以來,它已由milestone 2發展到milestone 3,在這個過程中,他們使JavaSrcipt代碼的傳送更加方便,但這樣中斷了我們的實例代碼。

 在M3中出現了一個新類ScriptBuffer,你可以把它建立在你的腳本中。ScriptBuffer有兩個重要的方法:appendScript和appendData。要在緩沖器中增加一些腳本文本,你只要使用appendScript()並用一個字符串做參數即可。

sb.appendScript("remoteTaskChanged(")

 要給那段腳本增加一個對象,用那個對象調用appendData():

sb.appendData(tasksevent.taskId)

 當然,我們還要完善JavaScript。因此按照上面兩行代碼,我們需要用:

sb.appendScript(");");

 關閉圓括號並結束這一行。現在,需要了解的是:ScriptBuffer方法返回ScriptBuffer本身,它允許你可以這樣連接方法調用:

sb.appendScript("remoteTaskChanged(").appendData(tasksevent.taskId).

 我們還修改了JavaScript客戶端代碼,去掉了“If something has changed, reload everything”代碼並用更加智能的Html表來代替它,清除刪除行,插入需要的行,並把單獨一個任務改變而引起的變化減到最少。我們還對許多你感興趣的內容進行了改變,增加了大量注釋。

進階參閱

 這裡我們僅對Maven的用法進行了簡單說明。我們主要利用Maven的默認行為,這些行為源自Maven的Super POM文件,所有POM文件和默認的插件都由它發展而來。因為我們只是移植一個現有的應用程序,我們不必使用Maven的原形機制——它生成新的模板式artifact目錄,完善POM文件。要學習更多與Maven相關的內容,Maven網站是最權威的參考網站。Mergere的免費PDF電子書《Maven應用指南》是一本優秀的快速入門書籍。你必須注冊,但值得這樣做。Maven改變你開發並建立完美Java代碼的方式。

 DJ Walker-Morgan是一名開發者顧問,他專門研究Java和用戶對用戶通訊與會議。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved