本格堅守四不一沒有政治主張:不知道、不清楚、不瞭解、不明白、沒有我的事!
[ start | index | login or register ]

Maven 初探

Created by Ada. Last edited by Ada, one year and 338 days ago. Viewed 967 times. #20
[diff] [history] [edit] [rdf]
labels
Parent:Maven
attachments
dir.tree.gif (5307)
genapp.gif (14783)
jar.goal.gif (12292)
radeox.group.gif (19410)
regenerate.gif (22479)

Maven 初探

颱風前後,簡單進行了將現有專案移轉到 Maven 的可行性評估。

以下是以先前開發的 SnipSnap plugin 做一個簡單的記錄:

※注意:若使用 UTF-8 作為 .xml 檔之文件編碼,則要注意將檔頭之 Unicode 標記移除!

安裝

參考 >>Installing Maven 將 Maven 裝起來,當然相關的環境變數就不多說了。

選定專案目錄

選定一個新的目錄,作為專案的基礎目錄,如:E:\MAVEN_PROJECT\myProject。

初始化專案樣本

在 DOS 視窗中切換到前述專案目錄下,鍵入 maven genapp 。其中 templates 可以選擇 default ( 一般 Application 或 jar 類別庫 ) 或 web ( 一般 Web Application ),如附圖:
建立專案樣本環境

移除不必要之檔案

Maven 的各類預設樣本皆會在目錄中留下一些足供 Maven 運作卻非專案所需的檔案,這類的檔案可以全部移除。如 src/conf/app.properties 或 src/App.java 等,其中 src/test 目錄進行 junit test 測試的預設目錄,也可以刪除之。

移入專案相關檔案

將原先已寫好的原始檔案複製到 src/java 目錄下,並且一併將 snipsnap 要求的 services/ 目錄複製到 conf/ 下。有關於是否要將 services/ 放到 conf/ 目錄下其實可以透過 project.xml 再進行設定(有些會認為要放到 resources/ 目錄下)。完整目錄結構可參考附圖:
專案目錄結構

管理類別庫

Maven 本地端資源庫

雖然說 Maven 會自動由網路上載入專案指定版本的 jar 類別庫,但也可能因為該類別庫為公司獨立開發或其他因素之故必須自行準備,此時要自行將該類別庫放入 Maven 的本地端資源庫 (Maven Local Repository) 中。
Maven 本地資源庫:Windows 所在目錄
echo "%USERPROFILE%\.maven\repository"

Maven 本地資源庫:Linux 所在目錄
echo "$HOME/.maven/repository"

新增自有類別庫

Maven 使用 groupId、artifactId、version 作為識別一個 jar 類別庫的依據,依次代表該 jar 檔的 群組別jar檔名稱版本別 。若要新增非公開的類別庫時只須在 Maven 的本地資源庫所在目錄中建立 ${groupdID}/jars/${artifactId}-${version}.jar 檔即可,如附圖即為建立兩個附屬於 radeox 群組的類別庫:
建立自有的類別庫

原始 project.xml 檔

透過 genapp 這個 goal 會產生一個 project.xml 的基本檔,我們可以自行修改這個檔的內容。預設的檔案內容如下:
project.xml
<?xml version="1.0" encoding="UTF-8"?>
<project>

<!-- the version of maven's project object model --> <pomVersion>3</pomVersion>

<!-- a unique name for this project --> <id>jspbbSnipSnap</id>

<!-- a short but descriptive name for the project --> <name>我的 SnipSnap 擴充套件</name>

<!-- The version of the project under development, e.g. 1.1, 1.2, 2.0-SNAPSHOT --> <currentVersion>1.0</currentVersion>

<!-- details about the organization that 'owns' the project --> <organization> <name>Apache Software Foundation</name> <url>>>http://www.apache.org/</url> <logo>>>http://maven.apache.org/images/jakarta-logo-blue.gif</logo> </organization>

<!-- the year the project started --> <inceptionYear>2002</inceptionYear> <package>net.jspbb</package> <logo>>>http://maven.apache.org/images/maven.jpg</logo> <description>A collection of example projects showing how to use maven in different situations</description> <!-- a short description of what the project does --> <shortDescription>How to use maven in different situations</shortDescription>

<!-- the project home page --> <url>>>http://maven.apache.org/reference/plugins/examples/</url> <issueTrackingUrl>>>http://nagoya.apache.org/scarab/servlet/scarab/</issueTrackingUrl> <siteAddress>jakarta.apache.org</siteAddress> <siteDirectory>/www/maven.apache.org/reference/plugins/examples/</siteDirectory> <distributionDirectory>/www/maven.apache.org/builds/</distributionDirectory>

<!-- the version control repository and http url for online access the connection element has the form: scm:<system>:<system specific connection string> --> <repository> <connection>scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:maven-plugins/examples</connection> <url>>>http://cvs.apache.org/viewcvs/maven-plugins/examples/</url> </repository>

<!-- any mailing lists for the project --> <mailingLists/>

<!-- who the developers are for the project --> <developers/>

<!-- jar files the project is dependent on --> <dependencies/>

<!-- build information for the project --> <build> <nagEmailAddress>turbine-maven-dev@jakarta.apache.org</nagEmailAddress> <sourceDirectory>src/java</sourceDirectory> <unitTestSourceDirectory>src/test</unitTestSourceDirectory> <unitTest> <includes> <include>**/*Test.java</include> </includes> <excludes> <exclude>**/NaughtyTest.java</exclude> </excludes> </unitTest> <resources> <resource> <directory>src/conf</directory> <includes> <include>*.properties</include> </includes> </resource> </resources> </build> </project>

類別庫相依性設定

在 project.xml 中可以指定專案所須的類別庫及其版號,修改 <dependencies/> 如下:
project.xml 之相依性設定
  <dependencies>
    <!-- 一個相依性設定紀錄 -->
    <dependency>
      <!-- 類別庫所屬群組 -->
      <groupId>snipsnap</groupId>
      <!-- 類別庫實際名稱 -->
      <artifactId>snipsnap-servlets</artifactId>
      <!-- 類別庫版號,此處是依據目前 snipsnap 及 redeox 的發佈版本而指定 -->
      <version>1.0b2</version>
    </dependency>
    <dependency>
      <groupId>radeox</groupId>
      <artifactId>radeox-api</artifactId>
      <version>1.0b2</version>
    </dependency>
    <dependency>
      <groupId>radeox</groupId>
      <artifactId>radeox</artifactId>
      <version>1.0b2</version>
    </dependency>
  </dependencies>

調整專案建置程序

在 <build/> 區段中可以指定 Maven 在建置程序中的一些細節,此處我們不做 JUnit 測試,並且預訂讓打包後的 jar 檔包含整個 Maven 建置設定。
build 程序
  <!-- build information for the project -->
  <build>
     <!-- 維護人員 email -->
    <nagEmailAddress>myemail@no-spam.org</nagEmailAddress>
      <!-- java 原始檔所在目錄,相對於 ${basedir} 所在目錄 -->
    <sourceDirectory>src/java</sourceDirectory>
      <!-- 不需要做 JUnit Test -->

<!-- 資源區 --> <resources> <!-- 一項資源的設定 --> <resource> <!-- 資源所在目錄,一樣是相對於 ${basedir} 的所在目錄 --> <directory>src/conf/services</directory> <!-- 複製到目的目錄,這是相對於 ${maven.build.dest} 而言 --> <targetPath>META-INF/services</targetPath> <!-- 所有的檔案含目錄都複製過去 --> <includes> <include>**/*.*</include> </includes> </resource> <resource> <directory>./</directory> <targetPath>./</targetPath> <includes> <include>**/*.*</include> </includes> <!-- 不含以下指定目錄,${basedir}/target/ 目錄是建制時所產生的目錄 --> <excludes> <exclude>**/target/</exclude> </excludes> </resource> </resources> </build>

初步執行

透過 jar 這個 goal 可以建立一個 jar 檔,請參考以下附圖。特別注意的是其中有一段複製檔案的輸出區塊,它的 goal name 是 java:jar-resources,這個資訊等下會使用到。
建立 jar 檔

額外處理

有時候會因為使用的編輯器的關係而在專案目錄中建立許多的備份檔,光靠前述的建置程序也會將這些檔案包到 jar 檔中。雖說可以透過 excludes 設定將特定的檔案排除,但個人比較喜歡事先將這些廢棄物予以刪除。

雖然 Maven 有內建一個叫做 clean 的 goal,但這個 goal 只限於清除暫存目錄而以,完全無法滿足這龜毛的要求。不過 Maven 可以在每一個 goal 的前後依需要執行一些額外的程序,其使用的語法則非常類似 ant 的 scripts。

maven.xml

透過 maven.xml 可以自行新增一個 goal,也可以在設定在某個 goal 執行前後所要另行處理的動作。由前圖中可知 Maven 是在 java:jar-resources 這個 goal 時進行檔案複製動作的,那只要在這個 goal 執行前將不想要的檔案予以刪除即可。以下是刪除 .bak 檔的 maven.xml 檔,這個檔案必須與 project.xml 放在同一個目錄中才能運作。

maven.xml
<?xml version="1.0" encoding="UTF-8" ?>
<project>
  <!-- preGoal 表示在指定(name)的 goal 之前要執行的動作 -->
  <preGoal name="java:jar-resources">
    <!-- 刪除 META-INF 目錄,這是解開 .jar 檔時所產生的目錄 -->
	 <delete quite="true" dir="${basedir}/META-INF"/>
    <!-- 刪除 net 目錄,這是 .java 檔編譯後所產生的目錄 -->
	 <delete quite="true" dir="${basedir}/net"/>
    <!-- 刪除所有附檔名為 bak 的檔案 -->
    <delete quiet="true">
      <fileset dir="${basedir}">
        <include name="**/*.bak"/>
      </fileset>
    </delete>
  </preGoal>

<!-- postGoal 表示在指定(name)的 goal 之後要執行的動作--> </project>

可發現,maven.xml 中在 <preGoal /> 內的語法與 ant 一模一樣,但是除了 ant scripts 外,其實尚可使用 jelly scripts,只是這部份有空時再研究吧!

從 jar 檔透過 Maven 重新發佈

前述的設定目的是為了讓 .jar 檔包含重新發佈時所需的相關參數,此處將先前建立的 jspbbSnipSnap-1.0.jar 解壓到 E:\MAVEN_PROJECT\test 目錄下並償試重新建立 jar 檔,如附圖。
測試重新建立 jar 檔

完成建置程序後,可以發現原先的 META-INF 及 net 目錄已被移除,目標達成!同時我們也可以發現整個輸出的訊息有兩種:一種是由 [] 所前導的訊息,另一種則無。若已熟悉 ant 的操作者應該會發現其實 Maven 是以 ant 為其底層支援系統,這表示先前所撰寫的 ant scripts 將可以在 Maven 下繼續使用。

no comments | post comment


【求助】

  1. 如何指定格式化的文字
  2. 如果字太小
【SnipSnap 強化方案】
>>SnipIt 誕生
>>功能討論
>>功能確認

< January 2009 >
SunMonTueWedThuFriSat
123
45678910
11121314151617
18192021222324
25262728293031

【RSS 訂閱】




【雜想分類區】
美食小吃
生活雜想
職場遭遇戰
休閒娛樂
台北居、大不易
錯誤正在橫行中
廣告異聞錄
神秘事件簿
電影
健康管理
資訊電腦
科高地球
手機應用
新聞馬後炮
動漫世界
管理眾人之事
專案管理
歌曲歌詞
嘸爽啦!
部落格記錄
惡搞裝笨耍白爛
歧視非IE用戶之網頁
關於我
CSS
RSS

【與 Ada 聯絡】

【Windows 多媒體播放工具】
介紹:多功能免費媒體播放工具 MyMPC 2006 安裝介紹
下載(1):>>MyMPC 20060117 簡、繁、英三合一安裝版
下載(2):>>MyMPC 20060117 簡、繁、英三合一安裝版

【Firefox 擴充套件自動安裝服務】
>>建議擴充套件介紹
>>擴充套件分類介紹
※更新日期:2007-04-12

【有趣的 Blog】
>>什麼都破,什麼都爛,什麼都不奇怪
>>酪梨壽司的日記
>>去吧!錯誤特攻隊!
>>隨裕而安
>>荒謬大觀
>>網路黑貓
>>瑞克梅添涼 DALIREAL
>>鳥毅的blog
>>潛艦 - >>反垃圾信
>>窮留學生懶人食譜
>>約耳談軟體

【工具網站】
>>dns checker
>>美國街道電子地圖

【網路貼紙】
XHTML 1.0 validated CSS validated
RSS 2.0 validated Powered by SnipSnap
Powered by Gentoo Linux
網站使用 UTF-8 編碼 網站所在地-台灣
Onion Club 洋蔥酷樂部 Powered By PostgreSQL
我是台灣人

【網路同盟】
怠墮管理者同盟

【PCDVD 七八區 RSS】




【PCDVD 疑雜區 RSS】




【網路串連】









【參訪團】

snipsnap.org | Copyright 2000-2002 Matthias L. Jugel and Stephan J. Schmidt