maven 項目構建

Maven是apache的一個開源項目。是一個用來把源代碼構建成可發佈的構件的工具。

Maven的功能非常強大,可以認爲是一個項目管理工具,不僅僅是一個構建工具。

Maven本身的核心很小,但是可以在上面擴展出很多的插件。Mven採用的是插件的思想,通過插件的功能擴展出很多的功能。同時Maven採用約定大於配置的思想,在項目中採用了很多約定規則來減少配置。不想ant這樣的構建工具需要很多的配置。作爲一個項目構建工具,最重要的是管理項目的庫和項目之間的依賴關係。

本文將以以下面的例子,來作爲學習maven的一個過程。

假設要構建一個名爲Content-Search的項目,該項目包含了三個子項目:contentSearch-dal,contentSearch-biz,contentSearch-web。項目採用Struts2、hibernate3、spring2.5的框架結合。使用mysql數據庫。

contentSearch-web:Web層的代碼, struts2+spring2.5結合的框架。

contentSearch-biz:業務邏輯層代碼。

contentSearch-dal:數據持久層代碼。

三個項目之間的依賴和對外部庫的依賴關係大概如下:

 

 

maven example

 

作爲從一個項目構建工具角度出發,maven主要要實現的就是項目的依賴的二方、三方庫管理,項目之間的依賴管理。以及項目的整個生命週期的管理,包括編譯(compile)、測試(test)、打包(packaging)、部署(install)等。

以以上爲背景,先介紹下maven的基本概念:

依賴管理:對每個項目對外部的依賴的管理。

遠程倉庫:maven外部引用倉庫的管理。

項目LifeCycle抽象和管理:項目生命週期編譯、測試和打包等過程的抽象和管理。

 

1. Maven安裝

http://maven.apache.org/download.html在上面根據不同的操作系統選擇不同的安裝版本。

安裝後的目錄結構如下:

bin/:maven腳本

boot/

conf/:全局的settings.xml。 如果需要自己定製可以覆蓋.m2文件夾裏的settings.xml文件。

lib/:有包含maven核心的jar文件

設置環境變量: M2_HOME=maven安裝路徑  Path: $M2_HOME/bin

 

 

2. Maven核心概念

groupId , artifactId, packaging, version:—— 以上4個是 Maven 的 坐 標(coordinates),它們唯一標識了一個項目。

groupId: 團體,公司,小組,組織,項目,或者其它團體。如contentSearch-web,contentSearch-dal,contentSearch-biz同屬一個groupId。

artifactId:在 groupId 下的表示一個單獨項目的唯一標識符。項目名稱ID 。

packaging: 標識項目的類型,如jar,war等。

Version:版本號。

以文章開頭的例子爲例,contentSearch-web的座標可以定義如下:

groupId: com.companyName.contentSearch

artifactId:contentSearch-web

packaging: war

Version:1.0。

而contentSearch-dal的座標如下:

groupId: com.companyName.contentSearch

artifactId:contentSearch-dal

packaging: jar

Version:1.0。

在一個 Maven 倉庫中,所有的東西存儲在一個與 Maven 項目座標十分匹配的目錄結構中。

/groupId/artifactId/version/artifactId-version.packaging.

 

POM:項目抽象模型

這是maven非常核心的概念。Maven通過它來管理項目。每一個項目都有一個pom.xml文件,該文件定義了改項目的基本信息,依賴關係等,maven對項目的生命週期管理也是基於此文件。以contentSearch-dal爲例,該項目的pom.xml定義如下(關於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/maven-v4_0_0.xsd">

         <modelVersion>4.0.0</modelVersion>

         <parent>

                   <groupId> com.companyName.contentSearch</groupId>

                   <artifactId>contentSearch</artifactId>

                   <version>1.0</version>

         </parent>

         <artifactId>contentSearch-dal</artifactId>

         <packaging>jar</packaging>

         <version>1.0</version>

         <name>contentSearch-dal</name>

         <url>http://maven.apache.org</url>

         <dependencies>

                   <dependency>

                            <groupId>junit</groupId>

                            <artifactId>junit</artifactId>

                            <version>3.8.1</version>

                            <scope>test</scope>

                   </dependency>

                   <dependency>

                            <groupId>generalorm</groupId>

                            <artifactId>hibernate</artifactId>

                            <version>3.0</version>

                   </dependency>

                   <dependency>

                            <groupId>mysql</groupId>

                            <artifactId>mysql-connector-java</artifactId>

                            <version>5.1.6</version>

                   </dependency>

                   <dependency>

                            <groupId>log4j</groupId>

                            <artifactId>log4j</artifactId>

                            <version>1.2.14</version>

                   </dependency>

                   <dependency>

                            <groupId>dom4j</groupId>

                            <artifactId>dom4j</artifactId>

                            <version>1.6.1</version>

                   </dependency>

                   <dependency>

                            <groupId>slf4j</groupId>

                            <artifactId>slf4j-api</artifactId>

                            <version>1.5.8</version>

                   </dependency>

                   <dependency>

                            <groupId>slf4j</groupId>

                            <artifactId>slf4j-nop</artifactId>

                            <version>1.5.2</version>

                   </dependency>

                   <dependency>

                            <groupId>antlr</groupId>

                            <artifactId>antlr</artifactId>

                            <version>2.7.6</version>

                   </dependency>

                   <dependency>

                            <groupId>jta</groupId>

                            <artifactId>jta</artifactId>

                            <version>1.1</version>

                   </dependency>

                   <dependency>

                            <groupId>javassist</groupId>

                            <artifactId>javassist</artifactId>

                            <version>3.9.0.GA</version>

                   </dependency>

                   <dependency>

                            <groupId>commons-collections</groupId>

                            <artifactId>commons-collections</artifactId>

                            <version>3.1</version>

                   </dependency>

         </dependencies>

</project>

Repository

倉庫,二方庫,三方庫的概念。每當安裝完成maven之後就會有一個默認的本地倉庫和遠程倉庫。本地倉庫在用戶工作目錄下的.m2文件夾,如在linux下爲/home/yblin/.m2。遠程repository默認在settings.xml裏面配置,如果要修改該文件必須在.m2文件夾下面替換一下即可。當進行編譯的時候,maven會先查找本地Repository,如果本地Repository沒有,會去取遠程repository 。

 

 

3. Maven命令

創建一個項目:

mvn archetype:create -DgroupId=com.xxx.simple  - DartifactId =simple

archetype:create是一個goal,-DgroupId=org.sonatype.mavenbook.ch03代表要傳到目標goal任務的參數,以-D開頭。

插件和目標:maven archetype:create. Archetype是插件標識,create是目標標識。

一個 Maven 插件是一個單個或者多個目標的集合。Maven 插件的例子有一些簡單但核心的插件,像 Jar 插件,它包含了一組創建 JAR 文件的目標,Compiler插件,它包含了一組編譯源代碼和測試代碼的目標,或者 Surefire 插件,它包含一組運行單元測試和生成測試報告的目標。而其它的,更有專門的插件包括:Hibernate3 插件,用來集成流行的持久化框架 Hibernate,JRuby 插件,它讓你能夠讓運行 ruby 稱爲 Maven 構建的一部分或者用 Ruby 來編寫 Maven 插件。Maven也提供了自定義插件的能力。一個定製的插件可以用 Java 編寫,或者用一些其它的語言如 Ant,Groovy,beanshell 和之前提到的 Ruby。

 

生命週期命令:maven install等

Mvn install命令沒有進行任何插件配置或者定製,所以這個例子綁定了一組標準插件的目標到默認的生命週期。當 Maven 經過以 package 爲結尾的默認生命週期的時候,下面的目標按順序被執行:

resources:resources

      Resources 插件的 resources 目標綁定到了 resources 階段。這個目標復

      制 src/main/resources 下的所有資源和其它任何配置的資源目錄,到輸

      出目錄。

compiler:compile

      Compiler 插件的 compile 目標綁定到了 compile 階段。這個目標編譯

      src/main/java 下的所有源代碼和其他任何配置的資源目錄,到輸出目

      錄。

resources:testResources

      Resources 插件的 testResources 目標綁定到了 test-resources 階段。

      這個目標複製 src/test/resources 下的所有資源和其它任何的配置的測

      試資源目錄,到測試輸出目錄。

compiler:testCompile

      Compiler 插件的 testCompile 目標綁定到了 test-compile 階段。這個目

      標編譯 src/test/java 下的測試用例和其它任何的配置的測試資源目錄,

      到測試輸出目錄。

surefire:test

      Surefire 插件的 test 目標綁定到了 test 階段。這個目標運行所有的測試

      並且創建那些捕捉詳細測試結果的輸出文件。默認情況下,如果有測試失

      敗,這個目標會終止。

jar:jar

      Jar 插件的 jar 目標綁定到了 package 階段。這個目標把輸出目錄打包成

      JAR 文件。

當 Maven 運行一個目標的時候,每個目標都會訪問定義在項目 POM 裏的信息。

 

 

其他命令:

mvn install:install-file -DgeneratePom=true -DgroupId=jep -DartifactId=jep -Dversion=3.3.0 -Dpackaging=jar -Dfile=E:/lib/LIB_COMMON/jep-3.3.0-trial.jar:添加一個包到依賴庫。

mvn dependency:resolve  mvn dependency:tree瀏覽項目依賴。

mvn archetype:create :創建 Maven 項目

mvn compile :編譯源代碼

mvn test-compile :編譯測試代碼

mvn test : 運行應用程序中的單元測試

mvn site : 生成項目相關信息的網站

mvn clean :清除目標目錄中的生成結果

mvn package : 依據項目生成 jar 文件

mvn install :在本地 Repository 中安裝 jar

mvn eclipse:eclipse :生成 Eclipse 項目文件

4. Maven實踐

 

以文章開頭例子爲例,做爲實踐。

1. 下載依賴包,並添加到本地repository.如果配置了遠程依賴庫裏面已經有了這些依賴包,那無需下載,在編譯時會自動下載到本地庫。

下載struts2,hibernate2,spring2.5,mysql-jdbc等相關的包到本地,通過命令安裝到本地repository.

mvn install:install-file -DgrouptId=framework -DartifactId=spring-beans -Dversion=2.5.6 -Dfile=spring-beans-2.5.6.jar

該命令將spring-beans-2.5.6.jar安裝到本地repository.

2. 創建總控項目

mvn archetype:create命令創建總控項目,修改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/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId> com.companyName.contentSearch </groupId>

  <artifactId>contentSearch</artifactId>

  <packaging>pom</packaging>

  <version>1.0</version>

  <name>Chapter 6 Simple Parent Project</name>

  <modules>

    <module>contentSearch-dal</module>

    <module>contentSearch-biz</module>

    <module>contentSearch-web</module>

  </modules>

  <build>

    <pluginManagement>

      <plugins>

        <plugin>

          <groupId>org.apache.maven.plugins</groupId>

          <artifactId>maven-compiler-plugin</artifactId>

          <configuration>

            <source>1.5</source>

            <target>1.5</target>

          </configuration>

        </plugin>

      </plugins>

   </pluginManagement>

  </build>

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

  </dependencies>

</project>

3. 創建子項目

總控項目包括了三個子項目,在總控項目文件夾下面創建3個子項目如下:

contentSearch-dal:

<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>

 

<parent>

     <groupId> com.companyName.contentSearch </groupId>

     <artifactId>contentSearch</artifactId>

     <version>1.0</version>

</parent>

<artifactId>contentSearch-dal</artifactId>

<packaging>jar</packaging>

<version>1.0</version>

<name>contentSearch-dal</name>

<url>http://maven.apache.org</url>

<dependencies>

     <dependency>

         <groupId>junit</groupId>

         <artifactId>junit</artifactId>

         <version>3.8.1</version>

         <scope>test</scope>

     </dependency>

     <dependency>

         <groupId>generalorm</groupId>

         <artifactId>hibernate</artifactId>

         <version>3.0</version>

     </dependency>

     <dependency>

         <groupId>mysql</groupId>

         <artifactId>mysql-connector-java</artifactId>

         <version>5.1.6</version>

     </dependency>

     <dependency>

         <groupId>log4j</groupId>

         <artifactId>log4j</artifactId>

         <version>1.2.14</version>

     </dependency>

     <dependency>

         <groupId>dom4j</groupId>

         <artifactId>dom4j</artifactId>

         <version>1.6.1</version>

     </dependency>

     <dependency>

         <groupId>slf4j</groupId>

         <artifactId>slf4j-api</artifactId>

         <version>1.5.8</version>

     </dependency>

     <dependency>

         <groupId>slf4j</groupId>

         <artifactId>slf4j-nop</artifactId>

         <version>1.5.2</version>

     </dependency>

     <dependency>

         <groupId>antlr</groupId>

         <artifactId>antlr</artifactId>

         <version>2.7.6</version>

     </dependency>

     <dependency>

         <groupId>jta</groupId>

         <artifactId>jta</artifactId>

         <version>1.1</version>

     </dependency>

     <dependency>

         <groupId>javassist</groupId>

         <artifactId>javassist</artifactId>

         <version>3.9.0.GA</version>

     </dependency>

     <dependency>

         <groupId>commons-collections</groupId>

         <artifactId>commons-collections</artifactId>

         <version>3.1</version>

     </dependency>

</dependencies>

</project>

contentSearch-biz:

<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>

<parent>

     <groupId> com.companyName.contentSearch</groupId>

     <artifactId>contentSearch</artifactId>

     <version>1.0</version>

</parent>

<artifactId>contentSearch-biz</artifactId>

<packaging>jar</packaging>

<version>1.0</version>

<name>contentSearch-biz</name>

<url>http://maven.apache.org</url>

<dependencies>

     <dependency>

         <groupId>junit</groupId>

         <artifactId>junit</artifactId>

         <version>3.8.1</version>

         <scope>test</scope>

     </dependency>

     <dependency>

         <groupId> com.companyName.contentSearch </groupId>

         <artifactId>contentSearch-dal</artifactId>

         <version>1.0</version>

         <scope></scope>

     </dependency>

     <dependency>

         <groupId>com.sun</groupId>

         <artifactId>mail</artifactId>

         <version>1.4.3</version>

         <scope></scope>

     </dependency>

     <dependency>

         <groupId>com.sun</groupId>

         <artifactId>activation</artifactId>

         <version>1.1.1</version>

         <scope></scope>

     </dependency>

</dependencies>

</project>

contentSearch-web:

<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>

<parent>

     <groupId> com.companyName.contentSearch </groupId>

     <artifactId>contentSearch</artifactId>

     <version>1.0</version>

</parent>

<artifactId>contentSearch-web</artifactId>

<packaging>war</packaging>

<version>1.0-SNAPSHOT</version>

<name>contentSearch-web Maven Webapp</name>

<url>http://maven.apache.org</url>

<dependencies>

     <dependency>

         <groupId>apache.tomcat</groupId>

         <artifactId>servlet-api</artifactId>

         <version>2.5</version>

     </dependency>

     <dependency>

         <groupId>apache.commons</groupId>

         <artifactId>commons-fileupload</artifactId>

         <version>1.2.1</version>

     </dependency>

     <dependency>

         <groupId>commons-logging</groupId>

         <artifactId>commons-logging</artifactId>

         <version>1.0.4</version>

     </dependency>

     <dependency>

         <groupId>apache.tomcat</groupId>

         <artifactId>jsp-api</artifactId>

         <version>1.0</version>

     </dependency>

     <dependency>

         <groupId>junit</groupId>

         <artifactId>junit</artifactId>

         <version>3.8.1</version>

         <scope>test</scope>

     </dependency>

     <dependency>

         <groupId>framework</groupId>

         <artifactId>struts2-core</artifactId>

         <version>2.1.8</version>

     </dependency>

     <dependency>

         <groupId>framework</groupId>

         <artifactId>xwork-core</artifactId>

         <version>2.1.6</version>

     </dependency>

     <dependency>

         <groupId>framework</groupId>

         <artifactId>spring-core</artifactId>

         <version>2.5.6</version>

     </dependency>

     <dependency>

         <groupId>framework</groupId>

         <artifactId>spring-web</artifactId>

         <version>2.5.6</version>

     </dependency>

     <dependency>

         <groupId>framework</groupId>

         <artifactId>spring-context</artifactId>

         <version>2.5.6</version>

     </dependency>

     <dependency>

         <groupId>framework</groupId>

         <artifactId>spring-beans</artifactId>

         <version>2.5.6</version>

     </dependency>

     <dependency>

         <groupId>framework</groupId>

         <artifactId>freemarker</artifactId>

         <version>2.3.15</version>

     </dependency>

     <dependency>

         <groupId>framework</groupId>

         <artifactId>struts2-spring-plugin</artifactId>

         <version>2.1.8</version>

     </dependency>

     <dependency>

         <groupId> com.companyName.contentSearch </groupId>

         <artifactId>contentSearch-biz</artifactId>

         <version>1.0</version>

     </dependency>

     <dependency>

         <groupId>framework</groupId>

         <artifactId>struts2-json-plugin</artifactId>

         <version>2.1.8</version>

     </dependency>

</dependencies>

<build>

     <finalName>contentSearch-web</finalName>

     <plugins>

         <plugin>

             <groupId>org.mortbay.jetty</groupId>

             <artifactId>maven-jetty-plugin</artifactId>

             <version>6.1.9</version>

         </plugin>

     </plugins>

</build>

</project>

4. 編寫代碼,打包運行。

mvn clean install

mvn jetty:run

以上只是從構建的角度介紹maven的使用,還有很多其他的特性待以後學習後再做介紹。作爲一個優秀的構建工具,maven還是值得推薦的。

 

http://maven.apache.org/guides/ 

附上官網上的指南地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章