使用Maven管理Java項目

1、Maven入門

1.下載maven

Maven是基於項目對象模型(Project Object Model),能夠經過一小段描述信息來管理項目的構建、報告和文檔的項目管理工具,提供了一個倉庫的概念,統一管理項目所依賴的第三方jar包,最大可能避免了因爲環境變量的不一樣在不一樣電腦之間沒法運行的問題,Struts二、Hibernate都是採用maven部署的項目。它是Apache軟件基金會的一個開源項目,下載地址是:Apache Maven 注意:Maven3.3要求jdk版本爲1.7及以上。將壓縮包解壓到任意目錄:能夠看到以下的目錄結構:
mavenhtml

2.配置Maven環境

新建環境變量M2_HOME,其值爲maven的解壓目錄,並在path環境變量中引用M2_HOME下的bin目錄:java

shellM2_HOME:D:\Program Files (x86)\apache-maven-3.3.3

Path:...;%M2_HOME%\bin

接下來在命令行輸入mvn -v命令能夠查看版本:
maven版本web

3.使用maven建立helloworld項目

首先建立以下的目錄結構shell

src
    |----main
        |----java
            |----package
    |----test
        |----java
            |----package
    |----resources
pom.xml

main/java目錄下建立咱們的java源代碼:apache

javapackage org.gpf.maventest01.model;

public class HelloWorld {
    public String sayHelloWorld(){
        return  "Hello World!";
    }   
}

test/java目錄下建立咱們的測試代碼(使用了Junit4測試框架):編程

javapackage org.gpf.maventest01.model;

import org.junit.*;
import static org.junit.Assert.*;

public class HelloWorldTest {

    @Test
    public void testSayHelloWorld(){
        assertEquals("Hello World!",new HelloWorld().sayHelloWorld());
    }
}

接下來編寫pom.xml(能夠參見Struts2,如圖所示)
struts的maven部署
將其拷貝到項目的根目錄,並修改成以下:tomcat

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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>  <!-- maven版本,此值固定 -->

    <!-- 項目 -->
    <groupId>org.gpf.maventest01</groupId><!--項目包名-->
    <artifactId>maventest01</artifactId>  <!-- 模塊名,建議使用項目名 -->
    <version>0.0.1SNAPSHOT</version>    <!--版本,此處爲快照版本-->

    <!-- 依賴 -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>
</project>

接下來在命令行進入咱們的項目輸入mvn compile命令(首次運行會下載第三方插件和maven依賴的jar,請耐心等待),對該項目進行編譯。
編譯maven項目服務器

最後使用mvn test命令運行咱們的測試用例:app

使用maven運行測試用例

此時發現項目的根目錄下多了一個target目錄,其中class目錄就是生成的類文件,reports目錄就是一系列測試報告。框架

運行mvn package命令能夠打包咱們的項目,會生成maventest-0.0.1SNAPSHOT.jar

2、Maven核心知識

1.經常使用構建命令

mvn -v 查看maven版本
compile 編譯
test 測試
package 打包
clean 刪除target(字節碼和測試報告)
install 安葬jar包到本地倉庫

若是一個項目須要利用到其餘項目的jar包,一種方式是拷貝jar包並拷貝到classpath中,maven提供了一個更簡單的策略,直接在本地倉庫中查找便可。例如咱們一個新的項目maven02項目須要使用到以前的maven01項目的HelloWorld類中的sayHelloWorld方法,使用maven能夠這樣:

  1. 在maven01項目中運行mvn install命令安裝jar包到本地倉庫。
  2. 建立maven02項目,在其中導入maven01項目的類。

src/main

javapackage org.gpf.maventest02.util;

import org.gpf.maventest01.model.HelloWorld;

public class Speak {
    public String sayHi(){
        return  new HelloWorld().sayHelloWorld();
    }   
}

src/test

javapackage org.gpf.maventest02.util;

import org.junit.*;
import static org.junit.Assert.*;

public class SpeakTest {

    @Test
    public void testSayHi(){
        assertEquals("Hello World!",new Speak().sayHi());
    }
}

3.在pom.xml添加依賴。

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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>org.gpf.maventest02</groupId>
    <artifactId>maventest02</artifactId>
    <version>0.0.1SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
        <!-- 添加maven01的jar的依賴,能夠從maven01項目的pom.xml中拷貝 -->
        <dependency>
            <groupId>org.gpf.maventest01</groupId>
            <artifactId>maventest01</artifactId>
            <version>0.0.1SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
  1. 使用mvn compile命令編譯maven02項目。

2.使用archetype插件自動建立符合maven的目錄骨架

  • 方式一:使用mvn archetype:generate根據提示一步步操做;
  • 方式二:使用mvn archetype:generate -D命令一次性生成所有。

3.maven中的座標和倉庫

maven中任何一個依賴、插件均可以被稱爲構件。全部構件經過座標做爲其惟一標識。

倉庫能夠管理項目的依賴。倉庫能夠分爲本地倉庫和遠程倉庫,若是本地倉庫中找不到就會在遠程倉庫中查找並下載,若是遠程倉庫找不到就會報錯。maven遠程倉庫的地址能夠在maven安裝目錄的lib目錄的maven-model-builder-3.3.3.jar中找到,如圖所示:

maven jar

pom.xml打開。
maven中央倉庫

鏡像倉庫

因爲maven的中央倉庫位於國外,速度慢,也有可能其餘緣由沒法訪問,咱們可使用國內的鏡像倉庫。配置鏡像倉庫須要修改conf/settings.xml,打開該文件修改mirror標籤以下:

xml<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
      <mirror>
      <id>maven.net.cn</id>
      <mirrorOf>central</mirrorOf>
      <name>central mirror in china</name>
      <url>http://maven.net.cn/content/groups/public</url>
    </mirror>
  </mirrors>

maven倉庫默認是放在用戶目錄的.m2隱藏目錄下的,Windows系統就是C:\Users\用戶名\.m2,咱們須要將倉庫遷移到其餘目錄,修改conf/settings.xml,如圖所示:

修改maven倉庫位置

settings.xml複製到E:/tmp/mavenproject/repo,這樣更新maven就不須要從新配置settings.xml了。

4.在MyEclipse中使用maven

MyEclipse默認安裝了maven插件,極大簡化了操做。在使用MyEclipse建立項目以前須要進行以下的配置:

  1. 配置maven安裝目錄(自帶的可能有錯)
    MyEclipse的maven配置1

  2. 給jre添加一個運行時參數(錯誤-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.的解決方案)
    MyEclipse的maven配置2

使用MyEclipse建立Maven項目的步驟(注意選擇合適的Junit版本,默認是3.8.1,咱們須要該變成4.10)以下:

MyEclipse使用maven-1
MyEclipse使用maven-2
MyEclipse使用maven-3

接下來在MyEclipse中運行maven項目,右鍵項目名---Run As會出現以下菜單:

在MyEclipse中運行Maven

在彈出的的對話框的Goals中輸入maven命令(compile、test、package等)便可。

5.maven的生命週期和插件

maven有3個獨立的階段。

clean(清理)

  • pre-clean
  • clean
  • post-clean

default(構建、最核心)

  • compile
  • test
  • package
  • install

site(生成項目站點)

  • pre-site
  • site(生成項目的站點文檔)
  • post-site
  • site-deploy(發佈站點到服務器)

Maven是基於插件的,咱們能夠在http://maven.apache.org/plugins/index.html找到合適的插件,例如源代碼打包插件source插件。

編輯pom.xml,配置source插件(能夠參見source插件文檔

xml<project>
  ...
  <build>
        <plugins>
        <plugin>
          <!-- 配置插件 -->
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
          <version>2.4</version>
          <!-- 綁定插件到package階段,若是運行package命令將會打包源代碼 -->
          <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>jar-no-fork</goal>
                </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
    ...
<project>

使用clean package命令,運行結果:
maven的source插件

6.pom.xml文件解析

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

  <!-- 指定當前pom的版本 -->
  <modelVersion>4.0.0</modelVersion>

    <!-- 主項目座標 -->
  <groupId>org.gpf.maventest</groupId> <!-- 域名倒置+項目名,也就是包名 -->
  <artifactId>maventest-demo</artifactId><!-- 項目名+模塊名 -->
  <version>0.0.1-SNAPSHOT</version><!-- 版本號(3個數字) 大版本.分支版本.小版本snapshot(快照)|alpha(內測)|beta(公測)|Release(穩定)|GA(正式)-->
  <packaging>jar</packaging><!-- 打包方式,默認是jar,還能夠是war、zip、pom -->

    <!-- 項目信息 -->
  <name>maventest-demo</name><!-- 項目描述名 -->
  <url>http://maven.apache.org</url><!-- 項目地址 -->
  <description></description><!-- 項目描述 -->
  <developers></developers><!-- 開發人員列表 -->
  <licenses></licenses><!-- 許可證信息 -->
  <organization></organization><!-- 組織信息 -->

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

    <!-- 依賴列表 -->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <type></type>
      <scope>test</scope><!-- 依賴範圍,只能在test -->
      <optional></optional><!-- 依賴是否可選,默認是false -->
      <exclusions><!-- 排除依賴傳遞傳遞列表 -->
        <exclusion></exclusion>
      </exclusions>
    </dependency>
  </dependencies>

    <!-- 依賴管理,定義在父模塊中供子模塊繼承使用 -->
  <dependencyManagement>
    <dependencies>
        <dependency></dependency>
    </dependencies>
  </dependencyManagement>

    <!-- 對構建提供支持 -->
  <build>
    <!-- 插件列表 -->
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.4</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>jar-no-fork</goal>
                </goals>
            </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <!-- 指定父模塊 -->
  <parent></parent>
  <!-- 多模塊編譯 -->
  <modules>
    <module></module>
  </modules>
</project>

7.依賴範圍

maven提供了3種classpath(編譯、測試、運行),例如上面的pom.xml的Junit框架的scope屬性爲test。http://maven.apache.org/guides/introduction/introduction-to-dependency...上提供了6種依賴範圍:

  • compile:缺省值,編譯、測試都有效
  • provided:編譯,測試都有效,可是在運行時並不會加入。例如Servlet API,由於Web容器自己有,若是加入就會出現衝突。
  • runtime:測試、運行有效。
  • test:僅測試時有效。
  • system:與本機相關,可移植性差。
  • import:導入的依賴範圍,僅適用在dependencyManager中,表示從其餘pom導入dependency配置。

8.依賴傳遞

建立3個maven項目,grandfather、father、son,其中father依賴grandfather,son又依賴father,他們之間構成依賴。

例如在Father項目的pom.xml中添加對GradFather的依賴,只須要在dependency標籤中指定GrandFather的座標便可,就像下面這樣:

xml<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
         <groupId>com.maventest</groupId>
        <artifactId>GrandFather</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

相似的在Son項目中添加對Father的依賴。如今構建Son須要先構建GrandFather和Father。對GrandFather和Father進行clean install命令,再對Son項目進行compile命令便可。構建完成後3個項目的目錄結構如圖:

maven的依賴傳遞

此時發現Son依賴了2個項目GrandFather和Father,若是僅僅但願Son依賴Father能夠將GrandFather的座標進行依賴排除

xml<dependencies>
    <dependency>
        <groupId>com.maventest</groupId>
        <artifactId>Father</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>com.maventest</groupId>
                <artifactId>GrandFather</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

9.依賴衝突

依賴衝突有2條原則:

  • 短路優先(優先解析路徑短的版本),例若有如下2個依賴:A-->B-->C-->x.jar,A-->D--x.jar(優先)
  • 路徑相同,先聲明先優先。

10.聚合與繼承

若是咱們的項目要使用到以上的GrandFather、Father、Son3個模塊,就可使用聚合。新建一個relationship項目,修改其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.maventest</groupId>
  <artifactId>relationship</artifactId>
  <version>0.0.1-SNAPSHOT</version>
<!-- 注意package的值爲pom -->
  <packaging>pom</packaging>

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

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

<!-- 導入模塊 -->
  <modules>
    <module>../GrandFather</module>
    <module>../Father</module>
    <module>../Son</module>
  </modules>
</project>```

在relationship項目運行`clean install`命令將會依次生成3個jar並加入本地倉庫。

在以上的項目中項目中每次都要配置Junit的依賴,咱們能夠向java編程那樣將公共的模塊抽取出來,這種方式叫作繼承。新建一個maven項目,命名爲common,其`pom.xml`配置以下:

```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.maventest.common</groupId>
  <artifactId>common</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

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

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit-version>3.8.1</junit-version>
  </properties>

<dependencyManagement>
    <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit-version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

</project>

這是項目可能有紅色的小叉,因爲父模塊不須要測試,咱們能夠刪除src/test從新更新maven項目(右鍵項目-->Maven ForMyEclipse-->Update Project Configuration),發現紅色的叉消失。在子模塊中咱們能夠這樣使用:

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.maventest</groupId>
  <artifactId>GrandFather</artifactId>
  <version>0.0.2-SNAPSHOT</version>
  <packaging>jar</packaging>

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

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

<!-- 引入父模塊座標 -->
<parent>
    <groupId>com.maventest.common</groupId>
    <artifactId>common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
  </dependencies>
</project>

3、使用Maven創建Web項目

新建一個maven項目,ArcheType選擇webapp,如圖所示:

maven構建web項目1
maven構建web項目2

pom.xml中配置tomcat插件(可參見Tomcat官方文檔)。

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.maventest.webdemo</groupId>
  <artifactId>webdemo</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>webdemo Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>webdemo</finalName>
    <plugins>
         <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
        </plugin>
    </plugins>
  </build>
</project>

clean-->package-->部署項目到Tomcat便可。

4、常見問題和解決方案

1.jdk版本不符合的問題

Eclipse中的jdk版本顯示爲1.5,可是編譯使用的版本是1.7,能夠參考如下的conf/settings.xml的配置:

xml<profile>
<id>jdk-1.7</id>
<activation> 
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk> 
</activation>

<properties> 
<maven.compiler.source>1.7</maven.compiler.source> 
<maven.compiler.target>1.7</maven.compiler.target> 
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion> 
</properties> 
</profile>
相關文章
相關標籤/搜索