Fork me on GitHub

Programming Design Notes

Eclipse + Maven 2 開發 Java SE 專案 - 1

| Comments

轉了新工作,所以比較忙碌,今天拿一點時間寫寫文章。新公司需要用到 Maven 這一套專案管理系統,以前我也想去學習一下,但因為要設定 XML 檔案或一些指令,最後又打消了念頭。現在因為新公司要用到 Maven,不學不行,只好硬著頭皮去學,在學習過程中真的覺得 Maven 是一套非常強大的管理系統,有點後悔太遲學。

Maven 是一套專案管理系統,Maven 使用一個 POM.xml (POM = Project Object Model) 去設定整個專案,Maven 不是只能管理單一專案,在一個專案內可能包括了數個不同組件的專案,Maven 也一樣支援。而 Maven 亦能替專案管理好依賴程式庫 (Library),就算是程式庫的依賴程式庫也一樣可以管理好,我認為這個是 Maven 最強大的功能。在還未學懂使用 Maven 之前,使用 Spring Framework 時,可能會不知道原來 Spring 是需要 Common Logging 這一個程式庫的,到運行程式發覺有錯誤,上網找找才知道要加入 Common Logging 這個程式庫。使用了 Maven 便不用再擔心這個問題,你只需要關心你的專案需要那一個程式庫,不用去關心程式庫依賴那一個程式庫,以下我會使用一個簡單例子去幫助各位去學習 Maven

學習 Maven 前請先準備 Eclipse,為什麼要用 Eclipse 呢,因為 Eclipse 有一個 MavenPlugin,這個 Plugin 可以幫助你去設定 Mavenpom.xml 又可以不用使用指令去操作 Maven。我認為學習 Maven 的最大阻力是設定 POM.xml 和指令部份,首先借助 Plugin 去了解 Maven 的基本結構,才慢慢去記一些指令和學習手動設定 POM.xml,會令學習更容易。

Eclipse 下載網址: http://www.eclipse.org/downloads/
m2eclipse (Plugin) 下載網址: http://m2eclipse.sonatype.org/installing-m2eclipse.html

安裝完成後請將 Eclipse 使用的 JRE 轉為 JDK

新增一個 Maven Project,如下圖所示:


選擇 Create a simple project,然後按 Next:


填上下圖的資料,然後按 Finish:


應該會見到 Project 的結構和下圖一樣:


因為是開發 Java SE 的項目,將 Perspective 轉為 Java:


變成以下樣子:


最後將 JRE System Library [J2SE-1.4] 改為你使用中的 Java SDK

Maven 的主要結構是由 2 個資料夾加上一個 pom.xml 所組成,src 這個資料夾是存放所有檔案的地方,項目所有檔案都是在這個資料夾內,而 target 這個資料夾可以不用理,因為是 Maven 存放完成檔案的地方,例如: JAR, WAR, EAR 等等。pom.xml 是存放 Maven 設定的地方,例如專案名稱,版本等等。

src 資料夾內又有 2 個檔案,一個是 main,一個是 testmain 資料夾用來存放項目的檔案,而 test 是存放測試程式的程式,例如 JUnit 的測試檔案。

maintest 資料夾都有 javaresource 這 2 個資料夾,java 資料夾是存放 Java Class 的地方,Resource 是存放程式需要用到的檔案,例如: 文字檔案,XML 檔案等等。

先試試寫一個 Hello World 的程式,在 src/main/java 內新增一個 Class:
package com.ctlok.pro.tutorial.maven.javase;

public class Main {

public static void main(String[] args) {

System.out.println("Hello World");

}

}

因為這個項目包括了 main methodMaven 在預設打包成的 JAR 是不會指定那一個 Classmain method,所以打包好的 JAR 不能直接執行。但我們可以靠一些 Maven Plugin 去變更 Maven 預設行為。

打開 pom.xml,在編輯器下面會有一些標籤,選擇 Plugin 標籤,然後在 Plugins 這個框架下按下 Add 這個按鈕,然後輸入 maven-jar,程式會搜尋到 2 個 plugins,選擇第一個再按下 OK 就可以了。


m2eclipse 這個 Plugin 不支援輸入 Maven Plugin 的設定,一定要手動加入才可以,在編輯器下面選擇 pom.xml 標籤,將 maven-jar-plugin 改為:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<manifest>
<mainClass>com.ctlok.pro.tutorial.maven.javase.Main</mainClass>
<packageName>com.ctlok.pro.tutorial.maven.javase</packageName>
</manifest>
<manifestEntries>
<mode>development</mode>
<url>${pom.url}</url>
</manifestEntries>
</archive>
</configuration>
</plugin>

完整的 pom.xml:
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ctlok.pro.tutorial.maven.javase</groupId>
<artifactId>javase</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>Maven Tutorial</name>
<description>Maven Tutorial</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<manifest>
<mainClass>com.ctlok.pro.tutorial.maven.javase.Main</mainClass>
<packageName>com.ctlok.pro.tutorial.maven.javase</packageName>
</manifest>
<manifestEntries>
<mode>development</mode>
<url>${pom.url}</url>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

選取 Project,然後 Run As -> Maven package,將會在 Console 出現以下資訊:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Tutorial 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.4.1:resources (default-resources) @ javase ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:2.0.2:compile (default-compile) @ javase ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.4.1:testResources (default-testResources) @ javase ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:2.0.2:testCompile (default-testCompile) @ javase ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.4.3:test (default-test) @ javase ---
[INFO] Surefire report directory: D:\testing\javase\target\surefire-reports

-------------------------------------------------------
T E S T S
-------------------------------------------------------
There are no tests to run.

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) @ javase ---
[INFO] Building jar: D:\testing\javase\target\javase-1.0.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.500s
[INFO] Finished at: Thu Sep 16 03:32:33 GMT 2010
[INFO] Final Memory: 2M/4M
[INFO] ------------------------------------------------------------------------

你會發現在 target 資料夾內出現一個 javase-1.0.0-SNAPSHOT.jar,可以試試用指令去執行這個 JAR:
C:\>java -jar javase-1.0.0-SNAPSHOT.jar

出現 Hello World 即代表打包成功。

下一篇: Eclipse + Maven 2 開發 Java SE 專案 - 2

相關書籍: Apache Maven 2 Effective ImplementationMaven: The Definitive GuideMaven: A Developer's Notebook (Developer's Notebooks)