Maven簡介、安裝與使用

1 Maven簡介

Maven是一個java項目管理工具,深化了ant,但又有自己一整套的項目集成策略。Apache Maven一個潛在的基於java的apache ant的構建工具的替代者。
Maven與ant兩者之間的比較:
第一:ant腳本是可以直接運行在maven中的。maven和ant最大的差別就是在於maven的編譯以及所有的腳本都有一個基礎,就是POM (project object model)。這個模型定義了項目的方方面面,然後各式各樣的腳本在這個模型上工作,而ant完全是自己定義,顯然maven更勝一籌。
第二:Maven對所依賴的包有明確的定義,如使用那個包,版本是多少,一目瞭然。而ant則通常是簡單的inclde 所有的jar。導致的最終結果就是,你根本無法確定JBoss中的lib下的common-logging 是哪個版本的,唯一的方法就是打開 META-INF 目錄下MANIFEST.MF。估計JBoss遲早會轉向Maven的。
第三:Maven是基於中央倉庫的編譯,即把編譯所需要的資源放在一箇中央倉庫裏,如jar,tld,pom等。當編譯的時候,maven會自動在倉庫中 找到相應的包,如果本地倉庫沒有,則從設定好的遠程倉庫中下載到本地。這一切都是自動的,而ant需要自己定義了。這個好處導致的結果就是,用maven 編譯的項目在發佈的時候只需要發佈源碼,小得很,而反之,ant的發佈則要把所有的包一起發佈,顯然maven又勝了一籌。
第四:maven有大量的重用腳本可以利用,如生成網站,生成javadoc,sourcecode reference等。而ant都需要自己去寫。
第五:maven目前不足的地方就是沒有象ant那樣成熟的GUI界面,不過mavengui正在努力中。目前使用maven最好的方法還是命令行,又快又方便。


2 Maven使用體驗

maven網站 下載maven2,解壓縮

配置環境變量:maven_home、path

cmd-> mvn --version 檢查是否安裝成功 [顯示版本號,則說明安裝成功]

配置,Maven的配置分爲三個層次:
- pom.xml: 針對某個項目的配置
- Installation:
- User: 針對某個用戶的配置
我們首先配置主要是user級別的,主要包括兩點:設置本地的資源庫和代理服務器[如果需要的話] 在%maven_home%/conf/setting.xml中配置:
       <localRepository>d:/repo</localRepository>
   
建立新的項目
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app
首先,程序會從遠程下載必要的jar包到你的localRepository,即我們剛剛設置的[d:/repo]
然後,會在當前目錄下面生成my-app文件夾,包括簡單的包結構[java,test]和一個HelloWorld程序及測試,以及pom.xml文件。
注意:pom.xml contains the Project Object Model (POM) for this project.The POM is the basic unit of work in Maven。

編譯
mvn compile
第一次運行會下載很多jar包,而且機器負荷會很重。運行這個命令需要在pom.xml相同目錄下面, 這個編譯只編譯主程序,不會編譯test下面的程序。
如果需要單獨編譯test,請運行:
mvn test-compile
compile之後會生成target文件夾,主程序編譯在classes下面,測試程序放在test-classes下

測試
mvn test
會自動先編譯再運行測試

打包
mvn package
打包之前會進行編譯,測試

安裝
mvn install
會將package之後的jar包copy到
<local-repository>/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar

其他
mvn site
注意,還可以:
deploy site
在pom.xml中加入
<distributionManagement>
    <site>
      <id> website </id>
      < url> scp://www.mycompany.com/www/docs/project/ </url>
    </site>
</distributionManagement>
當然你需要設置server
mvn site-deploymvn cleanmvn idea:idea [爲IDE工具idea生成項目文件]

Resource
${basedir}/src/main/resources都會編譯到jar文件中,而且該目錄下的內容將直接位於jar文件的頂部。
測試用資源文件-> ${basedir}/src/test/resources,引用時如下例:
InputStream is = getClass().getResourceAsStream( "/test.properties" );
文件位於 ${basedir}/src/test/resources/test.properties。

如何filter我們的資源文件
   < build >
     < resources >
       < resource >
         < directory > src/main/resources </ directory >
         < filtering > true </ filtering >
       </ resource >
     </ resources >
   </ build >
因爲原來默認的filter爲false所以要加上上面的代碼
eg:我們在src/main/resources下面建立application.properties文件
# application.properties application.name=${pom.name} application.version=${pom.version}
運行:mvn process-resources 在target/classes下面的application.properties結果爲:
# application.properties application.name=Maven Quick Start Archetype application.version=1.0-SNAPSHOT
這就是所謂的filter。當然filter還可以用其他的外部文件,不一定來自pom.xml[ ${pom.name} ]以及setting.xml[ ${settings.localRepository }]
e.g src/main/filters/filter.properties:
# filter.properties my.filter.value=hello!
pom.xml:
< build >
     < filters >
       < filter > src/main/filters/filter.properties </ filter >
     </ filters >
     < resources >
       < resource >
         < directory > src/main/resources </ directory >
         < filtering > true </ filtering >
       </ resource >
     </ resources >
   </ build >
# application.properties
application.name=${pom.name}application.version=${pom.version}message=${my.filter.value}
這樣在運行mvn process-resources 會得到類似的效果,當然我們也可以直接在pom.xml中定義:
  < build >
     < resources >
       < resource >
         < directory > src/main/resources </ directory >
         < filtering > true </ filtering >
       </ resource >
     </ resources >
   </ build >
   < properties >
     < my .filter.value > hello </ my.filter.value >
   </ properties >
效果同樣,這樣就不需要外部文件了。另外filter還可以來自系統設置以及可以自定義:
# application.propertiesjava.version=${java.version}command.line.prop=${command.line.prop}

jar包依賴
我們在mvn install後在local repo中生成的jar包也可以被其他項目所引用
<dependency>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <version>1.0-SNAPSHOT</version>
      <scope>compile</scope>
</dependency>
注意scope,這裏是compile,如果使用junit,scope是test。
舉例說明:如果我們的project需要用到log4j包,那麼我們可以 先google--"site:www.ibiblio.org maven2 log4j"。Index of /maven2/log4j/log4j 下面有maven-metadata.xml 描述了groupId,artifactId,version等等。獲取了這些信息之後,你 就可以在pom.xml中添加依賴
<dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
      <scope>compile</scope>
</dependency>

如何發佈我的jar包到我的remote repository
你需要在setting.xml中間設置server:
<servers>
    <server>
      <id>mycompany-repository</id>
      <username>jvanzyl</username>
      <!-- Default value is ~/.ssh/id_dsa -->
     <privateKey>/path/to/identity</privateKey>
     <passphrase>my_key_passphrase</passphrase>
    </server>
</servers>
然後在pom.xml中設置遠程url:
<distributionManagement>
    <repository>
      <id>mycompany-repository</id>
      <name>MyCompany Repository</name>
     <url>scp://repository.mycompany.com/repository/maven2</url>
    </repository>
</distributionManagement>


3 Maven Eclipse插件
你可以從http://m2eclipse.codehaus.orgupdate安裝Maven2的Eclipse插件,具體 安裝步驟請看該網站提供的Flash Demo: http://m2eclipse.codehaus.org/Installing_Maven_2.0_plugin_for_Eclipse.html

該插件的使用請看該網站提供的Flash Demo: http://m2eclipse.codehaus.org/Maven_2.0_Plugin_for_Eclipse.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章