星期四, 7月 13, 2006

Apache Maven(Project Management)備忘記

Maven 為 Apache 一項開源的軟件項目管理工具計劃,
它建基於項目物件模型(Project Object Model, POM)上,
就能一併對項目進行編譯, 測試, 發佈, 並能產生文檔及報告.


Maven 主要的目的是縮短開發員在開發過程對項目管理所需的時間.
使用 Maven, 只需要使用 Ant 的一半功夫,
就能自動建立更彈性的 project.

以下是 Maven 的目標:
(1) 使項目開發過程更輕鬆.
(2) 提供統一開發系統.
(3) 提供項目品質資訊.
(4) 提供更容易開發的指南.
(5) 允許輕鬆更新功能.



開始進行備忘:
[1] 安裝 Maven
[2] 建立第一個 Maven 管理的 porject
[3] 使用 Maven 對 Project 進行編譯
[4] 使用 Maven 對 Project 進行單元測試
[5] 使用 Maven 產生 Project Jar file
[6] 使用 Maven 將 project 發佈至服務容器


[1] 安裝 Maven
下載 maven-2.0.4-bin.zip
http://www.apache.org/dyn/closer.cgi/maven/binaries/maven-2.0.4-bin.zip
http://apache.mirrors.versehost.com/maven/binaries/maven-2.0.4-bin.zip


解壓至 D:\maven 下
將 D:\maven\bin 加入環境變數 PATH 裡, 方面日後隨處運行.
執行 D:\>mvn --version
出現 Maven version: 2.0.4 即表示安裝正常.


使用 unix like 系統的同志可參考官方安裝文檔:
http://maven.apache.org/download.html#Installation


[2] 建立第一個 Maven 管理的 porject

執行下面指令建立 project 基礎架構(由於需要下載plugin Jars, 必須連結Internet):
D:\>mvn archetype:create -DgroupId=test.joeyta.app -DartifactId=my-app
就會產生 D:\my-app 目錄.
test.joeyta.app 為 project 的 unique identifier.
my-app 為將來 project 產生檔案的基名.
輸出訊息如下所示:
[INFO] ------------------------------------------------
[INFO] Using following parameters for creating Archetype: maven-archetype-quickstart:RELEASE
[INFO] ------------------------------------------------
[INFO] Parameter: groupId, Value: test.joeyta.app
[INFO] Parameter: packageName, Value: test.joeyta.app
[INFO] Parameter: basedir, Value: D:[INFO] Parameter: package, Value: test.joeyta.app
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: artifactId, Value: my-app
[INFO] ******* End of debug info from resources from generated POM ********
[INFO] Archetype created in dir: D:\my-app
[INFO] ------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------
[INFO] Total time: 1 minute 39 seconds
[INFO] Finished at: Thu Jul 13 11:21:31 GMT+08:00 2006
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------



產生的 Maven project 目錄結構如下:
D:\my-app
-- pom.xml
`-- src
-- main
`-- java
`-- com
`-- mycompany
`-- app
`-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java


Maven 會產生兩個 sample files ( App.java 及 AppTest.java ),
用作 Maven 作 demo 測試.
------------------ App.java ------------------
package test.joeyta.app;
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}

------------------ App.java ------------------

------------------ AppTest.java ------------------
package test.joeyta.app;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
public class AppTest extends TestCase
{
public AppTest( String testName )
{
super( testName );
}
public static Test suite()
{
return new TestSuite( AppTest.class );
}
public void testApp()
{
assertTrue( true );
}
}
------------------ AppTest.java ------------------

檢視 pom.xml POM設定檔:

pom.xml (Project Object Model) 描述 Maven 工作基本單元,
這個檔案包含 Maven 需要建立 project 時的資訊及詳細設定.
內容為:
<project xmlns="http://maven.apache.org/POM/4.0.0" 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">
<modelVersion>4.0.0</modelVersion>
<groupId>test.joeyta.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>


project -- Maven pom.xml files 的 root element.
modelVersion -- POM 的版本號.
groupId -- project 的 unique identifier.
artifactId -- project 的基名, 用來產生檔案所需的基名. 如 myapp-1.0.jar.
packaging -- 產生的 package 類型, (e.g. JAR, WAR, EAR, etc.)
version -- project 的版本號.
name -- project 的顯示名稱.
url -- project 的網址.



[3] 使用 Maven 對 Project 進行編譯


進入目錄 D:\my-app ( 必須在 pom.xml 的根目錄編譯 )
執行指令
D:\my-app>mvn compile
就會對 project 進行編譯,
在第一次執行編譯指令時需要從網上下載一些plugin Jars, 之後執行則不用下載.


輸出訊息如下所示:
[INFO] [compiler:compile]
Compiling 1 source file to D:\my-app\target\classes
[INFO] -----------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] -----------------------------------------------------
[INFO] Total time: 20 seconds
[INFO] Finished at: Thu Jul 13 12:25:49 GMT+08:00 2006
[INFO] Final Memory: 3M/7M
[INFO] -----------------------------------------------------


就會產生 D:\my-app\target 這個目錄.
目錄結構如下所示:
D:\my-app
-- pom.xml
-- src
`-- target
-- classes
`-- test
`-- joeyta
`-- app
`-- App.class


如果使用 Ant 作同樣的事情, 需要編寫 build file 如下所示:
<project default="compile">
<property name="classesdir=" value="..." />
<property name="libdir" value="..." />
<target name="compile">
<mkdir dir="${classesdir}" />
<javac destdir="${classesdir}">
<src>
<pathelement location="src/main/java" />
</src>
<classpath>
<fileset dir="${libdir}">
<include name="*.jar" />
</fileset>
</classpath>
</javac>
</target>
</project>


由上面 Maven POM file 及 Ant Build file的比較,
就能明顯看出 Maven 的 POM file 管理 project 是如此的輕鬆.



[4] 使用 Maven 對 Project 進行單元測試


執行指令
D:\my-app>mvn test
就會對 project 進行單元測試,


輸出訊息如下所示:
[INFO] Surefire report directory: D:\my-app\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running test.joeyta.app.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.11 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] -----------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] -----------------------------------------------------
[INFO] Total time: 28 seconds
[INFO] Finished at: Thu Jul 13 12:41:57 GMT+08:00 2006
[INFO] Final Memory: 3M/6M
[INFO] -----------------------------------------------------


就會產生兩個目錄,
D:\my-app\target\surefire-reports
D:\my-app\target\test-classes
目錄結構如下所示:
D:\my-app
-- pom.xml
-- src
`-- target
-- classes
-- surefire-reports
`-- test.joeyta.app.AppTest.txt
`-- TEST-test.joeyta.app.AppTest.xml
-- test-classes
`-- test
`-- joeyta
`-- app
`-- AppTest.class


如果只想對 單元測試進行編譯而不需要測試, 則下執行以下指念
D:\my-app>mvn test-compile



[5] 使用 Maven 產生 Project Jar file


執行指令
D:\my-app>mvn package
就會對 project 進行封裝,


輸出訊息如下所示:
[INFO] [jar:jar]
[INFO] Building jar: D:\my-app\target\my-app-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------
[INFO] Total time: 12 seconds
[INFO] Finished at: Thu Jul 13 12:53:03 GMT+08:00 2006
[INFO] Final Memory: 3M/7M
[INFO] ------------------------------------------------


就會產生 D:\my-app\target\my-app-1.0-SNAPSHOT.jar


目錄結構如下所示:
D:\my-app
-- pom.xml
-- src
`-- target
-- classes
-- surefire-reports
-- test-classes
-- exported-pom.xml
-- my-app-1.0-SNAPSHOT.jar

由於在 pom.xml 設定了 packaging 為 jar, 故產生的為 *.jar



[6] 使用 Maven 將 project 發佈至服務容器


執行指令
D:\my-app>mvn install
就會對 project 進行編譯, 單元測試, 封裝, 及 發佈至服務容器.


輸出訊息如下所示:
[INFO] [jar:jar]
[INFO] Building jar: D:\my-app\target\my-app-1.0-SNAPSHOT.jar
[INFO] [install:install]
[INFO] Installing D:\my-app\target\my-app-1.0-SNAPSHOT.jar to C:\Documents and Settings\joeyta
\.m2\repository\test\joeyta\app\my-app\1.0-SNAPSHOT\my-app-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------
[INFO] Total time: 6 seconds
[INFO] Finished at: Thu Jul 13 13:07:54 GMT+08:00 2006
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------


這裡由於沒有設定發佈的服務器,
故預設發佈至 用戶目錄下的 ( ~/.m2/repository ),
Windows 下的 C:\Documents and Settings\joeyta\.m2\repository


可以執行指令 D:\my-app>mvn site 建立 Maven web site 於 D:\my-app\target\site 目錄下
可以執行指令 D:\my-app>mvn clean , 就會清除 D:\my-app\target 目錄.


由於這編文章只是入門備忘記, 故還有很多 Maven 的功能沒有提及,
官方有詳盡的教學可參考:
http://maven.apache.org/guides/getting-started/index.html

沒有留言: