maven對于管理大型項目來說是不錯的東西, 當然也可以僅用它來做依賴管理 (類似的有IVY), 不過我們有一些項目已經使用了ant來構建, 那么如何能二者兼得? 對ant的build.xml做小小的改動就可以同時支持使用maven來做依賴管理, 也可以使用ant來做構建. --- 當然簡單的構建其實不需要ant, maven完全可以勝任.
Maven的一些特性
- 可以方便進行依賴管理
- 提供了標準的目錄結構, 保證大家統一. (也可以覆蓋默認設置)
- 利用profile解決測試, 生產環境的配置問題
- 提供了標準的構建任務, 不需要自己寫
- 多個項目可以集中管理, 可以樹狀結構管理, 一目了然. 可以快速建立起開發環境. 基本上幾步就可以編譯項目了, 相反手動方式下, 每個項目都要配置依賴就要累死了.
- 基于約定的方式, 對于特殊情況處理起來有一些麻煩, 一些情況下ant更靈活方便.
我們的目標
1. 對喜歡maven的人, 能快速利用maven創建新的項目, 而不用痛苦地去一個一個找依賴, 作為普通開發者可以不關心復雜的build.xml, 或者直接用maven構建
2. 對原本使用ant腳本的項目, 在要求兼容maven的情況下, 僅僅添加maven的依賴管理, 同時可以為ant提供依賴包的自動收集, 不需要手動自己找.
3. 推行maven的使用, 快速創建開發環境.
4. subversion不在保存一堆一堆巨大的jar包
本文的內容主要是針對上面的第二條, 當然最終是希望推行maven, 方便管理.
首先我們要安裝好ant, maven2, 配置好環境變量, 修改maven的緩存路徑.
然后安裝 http://maven.apache.org/ant-tasks/index.html 包, 可以直接放在ant的lib目錄下, 當然還有其他方式, 例如在build.xml里指定路徑.
準備pom.xml, 針對本文所說情況, 只需要寫基本信息和依賴包配置即可.
舉例:
<?xml version="1.0" encoding="UTF-8"?>
<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.test</groupId>
<artifactId>maventest</artifactId>
<name>Maven Test</name>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.jgroups</groupId>
<artifactId>jgroups</artifactId>
<version>2.10.0.GA</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
如果有本地倉庫, 還可以配置repository. (推薦優先使用本地服務器), 這個文件內容很少, 主要是依賴包的信息, 也是我們最關注的信息.
下面我們來修改我們的build.xml, 為ant提供依賴服務:
<project name="jgroups" basedir="." xmlns:artifact ="urn:maven-artifact-ant" >
<!-- 存放依賴包的目錄 -->
<property name="build.lib.dir" location="./lib" />
<!-- find maven-ant-tasks, you can use classpathref to specify the jar, or just copy the jar to ant/lib -->
<typedef resource ="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant" />
<!-- maven的文件 -->
<artifact:pom id ="maven.project" file ="pom.xml" />
<artifact:dependencies filesetId="deps.fileset.compile" useScope="compile">
<!--<pom file="pom.xml"/>-->
<pom refid="maven.project" />
</artifact:dependencies>
<artifact:dependencies filesetId="deps.fileset.test" scopes="test">
<pom refid="maven.project" />
</artifact:dependencies>
<artifact:dependencies filesetId="deps.fileset.provide" scopes="provide">
<pom refid="maven.project" />
</artifact:dependencies>
<target name="lib.init">
<copy todir="${build.lib.dir}/compile">
<fileset refid="deps.fileset.compile"/>
<mapper type="flatten"/>
</copy>
<copy todir="${build.lib.dir}/test">
<fileset refid="deps.fileset.test"/>
<mapper type="flatten"/>
</copy>
<copy todir="${build.lib.dir}/provide">
<fileset refid="deps.fileset.test"/>
<mapper type="flatten"/>
</copy>
</target>
<!-- 
..其他

.. -->
</project>
主要增加了一個target, 就是把maven中定義的依賴包復制到指定目錄下, 而不需要自己準備或者從subversion下載.
(ant的其他target也可使用定義的幾個變量作為classpath)
一般依賴分三種, 請注意區分, 否則把servlet等jar包發布到服務器, 一般會出錯:
- compile: 編譯, 用于運行時和編譯時, 打包發布要包含
- provide: 容器提供的類, 主要用于編譯, 打包發布時不包含, 例如servlet-api
- test: 僅用于編譯和運行測試用例, 打包時不包含.
使用方法:
- checkout項目
- 使用ide的方式導入maven項目. 如果需要手動: 運行ant lib.init (如果下載jar時包出錯, 注意檢查groupId, artifactId和版本號.)
- 手動創建項目, 指定library, 就不需要一個一個找了. (如果導入maven項目的方式, 則一切自動會配置好)
參考網頁:
http://book.51cto.com/art/201001/177845.htm
http://skydream.javaeye.com/blog/437938
http://maven.apache.org/ant-tasks/examples/dependencies.html