maven3.0

Maven入門教程

1.1. 介紹、環境配置

1.1.1. Maven介紹

Maven是一個採用純Java編寫的開源項目管理工具, Maven採用了一種被稱之爲Project Object Model (POM)概念來管理項目,全部的項目配置信息都被定義在一個叫作POM.xml的文件中, 經過該文件Maven能夠管理項目的整個生命週期,包括清除、編譯,測試,報告、打包、部署等等。目前Apache下絕大多數項目都已經採用Maven進行管理. 而Maven自己還支持多種插件, 能夠方便更靈活的控制項目, 開發人員的主要任務應該是關注商業邏輯並去實現它, 而不是把時間浪費在學習如何在不一樣的環境中去依賴jar,項目部署等Maven正是爲了將開發人員從這些任務中解脫出來而誕生的html

1.1.2. Maven可以作什麼

l Jar聲明式依賴性管理java

l 項目自動構建web

1.1.3. 環境配置

l http://maven.apache.org/download.html 下載最新版本Maven 3.0.2 (Binary zip)apache

 

 

l 解壓到 D(自己就是綠色版不須要安裝):api

 

 

l 配置環境變量(配置以前,必須肯定配置了JDK環境變量)瀏覽器

MAVEN_HOME : D:\apache-maven-3.0.2
把此命令添加到Path: %MAVEN_HOME%\bin\緩存

l 配置用戶範圍的settings.xmltomcat

MAVEN_HOME/conf/settings.xml 全局的網絡

~/.m2/settings.xml 單個用戶的oracle

 

 

l 驗證安裝是否成功

在命令行上輸入: mvn -version;回車, 如看到下面信息表示安裝成功

 

 

1.1.4. Maven目錄分析

l bin:含有mvn運行的腳本

l boot:含有plexus-classworlds類加載器框架

l conf:含有settings.xml配置文件

l lib:含有Maven運行時所須要的java類庫

l Settings.xml 中默認的用戶庫: ${user.home}/.m2/repository

l Maven默認倉庫下載地址在: mavenlib目錄下maven-model-builder-3.0.4.jarpom.xml

1.2. 第一個Maven演示

1.2.1. 建立目錄結構

Convention Over Configuration (約定優於配置)。在現實生活中,有不少常識性的東西,地球人都知道。好比說:如何過馬路(紅燈停綠燈行),如何開門,關門等。對於這些事情,人們已經有了默認的約定, 在軟件開發過程當中,道理也是相似的,若是咱們事先約定好全部項目的目錄結構,標準開發過程(編譯,測試) , 全部人都遵循這個約定。軟件項目的管理就會變得簡單不少。在如今流行的不少框架中,都使用了這個概念

Hello

 --src   

 -----main

 ----------java       --用來存放Java文件

 ----------resources   --用來存放資源文件

 -----test

 ---------java        --用來存放測試的Java文件

 ---------resources

 --target           --項目輸出位置,編譯完畢後自動生成

 --pom.xml        -- 項目對象模型的描述 ,它是maven配置的核心

1.2.2. 創建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">

  <!-- 當前pom的版本號 -->

  <modelVersion>4.0.0</modelVersion>

  <!-- groupId: 當前jar所屬的命名空間 -->

  <groupId>cn.itcast.maven</groupId>

  <!-- 當前項目模塊名稱 -->

  <artifactId>Hello</artifactId>

  <!-- 當前項目的版本, SNAPSHOT鏡像版 -->

  <version>0.0.1-SNAPSHOT</version>

<!-- 當前模塊須要依賴的相關jar包,也稱爲依賴管理, 全部被依賴的包都是經過"座標"定位的 -->

<dependencies>

    <!-- 須要依賴junit 經過 groupId+artifactId+version來查找,若是本地沒有則到中央倉庫下載 -->

<dependency>

<!-- 當前jar所屬的命名空間 -->

<groupId>junit</groupId>

<!-- 依賴的項目模塊的名稱 -->

<artifactId>junit</artifactId>

<!-- 依賴的版本號 -->

<version>4.9</version>

<!-- 依賴的範圍, 有 test compile privlege -->

<scope>test</scope>

</dependency>

</dependencies>

</project>

pom.xml 文件是maven對一個項目的核心配置,這個文件將包含你但願如何構建項目的大多數配置信息。POM大而複雜,但你不用所有去了解,只要使用一些經常使用的配置就能夠了

1.2.3. 建立Java類與測試類

l 在src/main/java/cn/itcast/maven目錄下新建文件Hello.java

package cn.itcast.maven;

public class Hello {

public String sayHello(String name){

return "Hello "+name+"!";

}

}

l 在/src/test/java/cn/itcast/maven目錄下新建測試文件HelloTest.java

package cn.itcast.maven;

import org.junit.Test;

import static junit.framework.Assert.*;

public class HelloTest {

@Test

public void testHello(){

Hello hello = new Hello();

String results = hello.sayHello("litingwei");

assertEquals("Hello litingwei!",results);

}

}

1.2.4. 命令測試

打開cmd命令行, 進入Hello項目根目錄執行mvn compile命令, 查看根目錄變化

cmd 中繼續錄入mvn clean命令,而後再次查看根目錄變化

cmd 中錄入 mvn clean compile命令, 查看根目錄變化

cmd 中錄入 mvn clean test命令,查看根目錄變化

cmd 中錄入 mvn clean package命令,查看根目錄變化

1.3. Maven核心概念

1.3.1. Maven插件

Maven的核心僅僅定義了抽象的生命週期,具體的任務都是交由插件完成的每一個插件都能實現多個功能,每一個功能就是一個插件目標

Maven的生命週期與插件目標相互綁定,以完成某個具體的構建任務, Maven的插件在: .m2\repository\org\apache\maven\plugins

1.3.2. Maven座標

相似在平面幾何中座標(x,y)能夠標識平面中惟一的一點, Maven世界擁有大量構建,咱們須要找一個用來惟一標識一個構建的統一規範

擁有了統一規範,就能夠把查找工做交給機器

l groupId:定義當前Maven項目隸屬項目  (實際對應JAVA的包的結構, 是main目錄裏java的目錄結構)

l artifactId:定義實際項目中的一個模塊(項目的惟一的標識符,實際對應項目的名稱,就是項目根目錄的名稱)

l version:定義當前項目的當前版本

1.3.3. Maven倉庫

l 何爲Maven倉庫:用來統一存儲全部Maven共享構建的位置就是倉庫

l Maven配置jar包的路徑爲:groupId/artifactId/version/artifactId-version

l 本地倉庫(~/.m2/repository/):每一個用戶只有一個本地倉庫

l 中央倉庫(Maven默認的遠程倉庫)Maven默認的遠程倉庫下載地址爲:http://repo1.maven.org/maven2

l 私服:是一種特殊的遠程倉庫, 它是架設在局域網內的倉庫, 主要是爲了團隊協做開發

l 鏡像:用來替代中央倉庫, 速度通常比中央倉庫快

1.3.4. 生命週期

 

 

1.4. 第二個Maven演示

1.4.1. HelloFriend目錄結構

HelloFriend

 --src

 -----main

 ----------java

 ----------resources

 -----test

 ---------java

 ---------resources

 --pom.xml

1.4.2. 創建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>cn.itcast.maven</groupId>

<artifactId>HelloFriend</artifactId>

<version>1.0.0</version>

<packaging>jar</packaging>

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.9</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>cn.itcast.maven</groupId>

<artifactId>Hello</artifactId>

<version>1.0.0</version>

<scope>compile</scope>

</dependency>

</dependencies>

</project>

1.4.3. 建立Java類與測試類

l 在src/main/java/cn/itcast/maven目錄下新建文件HelloFriend.java

package cn.itcast.maven;

public class HelloFriend{

public String sayHello(String name){

return "Hello "+name+"!";

}

}

l 在/src/test/java/cn/itcast/maven目錄下新建測試文件HelloFriendTest.java

package cn.itcast.maven;

import org.junit.Test;

import cn.itcast.maven.Hello;

public class HelloFriendTest {

@Test

public void tesHelloFriend(){

HelloFriend helloFriend = new HelloFriend();

String results = helloFriend.sayHelloToFriend("litingwei");

System.out.println(results);

}

}

1.4.4. 命令測試

l 在HelloFriend目錄下執行 mvn clean mvn compile mvn test 都正常

l 在HelloFriend目錄下執行命令mvn package 系統報錯說沒有找到依賴, 由於HelloFriend依賴Hello模塊,可是此模塊在我的倉庫和中央倉庫中並不存在

l 須要從新構建Hello第一個項目並安裝到數據倉庫, Hello根目錄下執行mvn clean install, 就會部署的中央倉庫中

1.5. MavenEclipse整合

1.5.1. 配置maven插件

 

 

1.5.2. user settings

 

 

1.6. Maven部署到Tomcat

1.6.1. 建立Java項目

l 在MyEclipse建立項目的時候選擇Maven Project

 

 

l 在構件嚮導的時候選擇quickstart注意, 此嚮導也是插件,第一次使用的時候.也要從遠程倉庫中下載相應的jar, 所以須要網絡環境

 

 

l 設置當前模塊的座標,和相應的版本號

 

 

l 建立完畢後默認生成的項目包目錄以下

 

 

l 經過在pom.xml中配置相應Hello.jar便可

<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>Hello3</groupId>

  <artifactId>Hello3</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>jar</packaging>

  <!-- 當前Maven模塊的相關信息,可選信息 -->

  <name>Hello3</name>

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

  <!-- 設置常量, 下面能夠經過${project.build.sourceEncoding}來引用,通常來講版本號設置在此處 -->

  <properties>

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

  </properties>

  <!-- 依賴管理 -->

  <dependencies>

   <!-- 依賴Junit-->

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.9</version>

      <scope>test</scope>

    </dependency>

    <!-- 依賴前面的Hello, 那麼在倉庫中必須擁有 Hello的座標 -->

    <dependency>

     <groupId>cn.itcast.maven</groupId>

      <artifactId>Hello</artifactId>

      <version>0.0.1-SNAPSHOT</version>

    <scope>compile</scope>

    </dependency>

  </dependencies>

</project>

l 經過在pom.xml中單擊右鍵選擇相應的命令便可

 

 

1.6.2. 建立Web項目

l 選擇建立一個普通的web工程

 

 

l 設置相應的座標

 

 

l 若是採用src缺省的包結構,pom.xm中須要指定編譯和調試的目錄.

<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>web</groupId>

  <artifactId>web</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>war</packaging>

  <!-- 配置常量 -->

  <properties>

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

    <jstl.version>1.2</jstl.version>

    <compiler.version>1.6</compiler.version>

  </properties>

  <!-- 定義依賴管理 -->

  <dependencies>

   <!-- 定義須要依賴的系統jar, provided則在打包的時候不會包含 -->

    <dependency>

      <groupId>javax.servlet</groupId>

      <artifactId>jstl</artifactId>

      <version>${jstl.version}</version>

      <scope>provided</scope>

    </dependency>

    <dependency>

      <groupId>javax.servlet.jsp</groupId>

      <artifactId>jsp-api</artifactId>

      <version>2.1</version>

      <scope>provided</scope>

    </dependency>

    <!-- 定義依賴的第三方包,compile 則打包的時候會自動加載到lib目錄中 -->

    <dependency>

     <groupId>cn.itcast.maven</groupId>

      <artifactId>Hello</artifactId>

      <version>0.0.1-SNAPSHOT</version>

    <scope>compile</scope>

    </dependency>

  </dependencies>

  <!-- 用來定義構建階段的標籤 -->

  <build>

   <!-- 因爲採用的非Maven的約定,則在構建的時候要指定的目錄 -->

    <sourceDirectory>${basedir}/src</sourceDirectory>

   <outputDirectory>${basedir}/WebRoot/WEB-INF/classes</outputDirectory>

    <resources>

      <!-- 資源文件也存放到src中但排除 *.java -->

      <resource>

        <directory>${basedir}/src</directory>

        <excludes>

          <exclude>**/*.java</exclude>

        </excludes>

      </resource>

    </resources>

    <plugins>

      <!-- 配置相應的打包插件  -->

      <plugin>

        <artifactId>maven-war-plugin</artifactId>

        <configuration>

          <webappDirectory>${basedir}/WebRoot</webappDirectory>

          <warSourceDirectory>${basedir}/WebRoot</warSourceDirectory>

        </configuration>

      </plugin>

      <plugin>

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

        <configuration>

          <source>${compiler.version}</source>

          <target>${compiler.version}</target>

        </configuration>

      </plugin>

    </plugins>

  </build>

</project>

l 在index.jsp頁面中添加以下代碼

<body>

      <%    // 要導入相應: cn.itcast.maven.*

         Hello hello=new Hello();

            out.println(hello.sayHello("admin"));

      %>

</body>

1.7. Maven私服

1.7.1. 關於中央倉庫注意事項

l 地址: 目前來講: http://repo1.maven.org/maven2/是真正的Maven中央倉庫的地址,該地址內置在Maven的源碼中其餘的都是鏡像

l 索引: 中央倉庫帶有索引文件以方便用戶對其進行搜索,完整的索引文件大小約爲60M,索引每週更新一次

l 黑名單: 若是某個IP地址惡意的下載中央倉庫內容,例如全公司100臺機器使用同一個IP反覆下載,這個IP(甚至是IP段)會進入黑名單,所以稍有規模的使用Maven時,應該用Nexus架設私服

1.7.2. 爲何須要私服

爲何要搭建nexus私服,緣由很簡單,有些公司都不提供外網給項目組人員,所以就不能使用maven訪問遠程的倉庫地址,因此頗有必要在局域網裏找一臺有外網權限的機器,搭建nexus私服,而後開發人員連到這臺私服上,這樣的話就能夠經過這臺搭建了nexus私服的電腦訪問maven的遠程倉庫

 

 

1.7.3. Nexus環境搭建

第一步:下載nexus-webapp-1.9.2.4.war包,而後拷貝到tomcat下的webapps目錄中

第二步:啓動tomcat 默認登陸帳戶密碼爲: admin  admin123  

第三步:訪問http://localhost:8080/項目名稱/

1.7.4. 認識repository

Nexus倉庫的默認的地址, nexus-2.1.2\WEB-INF\plexus.properties 中定義的

Views/Repositories-->Repositories裏進行配置, nexus裏能夠配置3種類型的倉庫,分別是proxyhostedgroup

proxy:是遠程倉庫的代理。好比說在nexus中配置了一個central repositoryproxy,當用戶向這個proxy請求一個artifact,這個proxy就會先在本地查找,若是找不到的話,就會從遠程倉庫下載,而後返回給用戶,至關於起到一箇中轉的做用

Hosted:是宿主倉庫,用戶能夠把本身的一些構件,deployhosted中,也能夠手工上傳構件到hosted裏。好比說oracle的驅動程序,ojdbc6.jar,在central repository是獲取不到的,就須要手工上傳到hosted

Group:是倉庫組,在maven裏沒有這個概念,是nexus特有的。目的是將上述多個倉庫聚合,對用戶暴露統一的地址,這樣用戶就不須要在pom中配置多個地址,只要統一配置group的地址就能夠了右邊那個Repository Path能夠點擊進去,看到倉庫中artifact列表。不過要注意瀏覽器緩存。我今天就發現,明明構件已經更新了,在瀏覽器裏卻看不到,還覺得是BUG,實際上是被瀏覽器緩存了

virtual也是中央倉庫鏡像,支持M1老版本

1.7.5. 每一個倉庫的做用

3rd party: 沒法從公共倉庫得到的第三方發佈版本的構件倉庫
Apache Snapshots: 用了代理ApacheMaven倉庫快照版本的構件倉庫
Central: 用來代理maven中央倉庫中發佈版本構件的倉庫
Central M1 shadow: 用於提供中央倉庫中M1格式的發佈版本的構件鏡像倉庫
Codehaus Snapshots: 用來代理CodehausMaven 倉庫的快照版本構件的倉庫
Releases: 用來部署管理內部的發佈版本構件的宿主類型倉庫
Snapshots:用來部署管理內部的快照版本構件的宿主類型倉庫

 

 

 

 

 

1.7.6. Central Repository

最關鍵的一個配置, 就是Central Repositoryproxy配置,由於大部分的構件,都是要經過這個proxy獲得的,

1.7.7. 配置Hosted Repository

通常會配置3hosted repository, 分別是3rd partySnapshotsReleases,分別用來保存第三方jar(典型的好比ojdbc6.jar),項目組內部的快照、項目組內部的發佈版, 這裏並無什麼特別的配置,只是Deployment Policy這個選項,通常Snapshots會配置成容許,而Releases3rd party會設置爲禁止

 

 

1.7.8. 配置group repository

前面說過group實際上是一個虛擬的倉庫, 經過對實體倉庫(proxyhosted)進行聚合, 對外暴露一個統一的地址這裏要注意的是,放到左邊的倉庫,纔是會被聚合的倉庫

 

 

1.7.9. 從私服中下載資源

l 能夠在支持Maven的項目中進行以下配置

<repositories>

  <repository>

  <id>shop</id>

  <name>倉庫介紹</name>

  <url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url>

  </repository>

 </repositories>

 <pluginRepositories>

  <pluginRepository>

  <id>plugin</id>

  <name>插件下載地址</name>

  <url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url>

  </pluginRepository>

 </pluginRepositories>

l 也能夠把地址配置在setting.xml<profiles>標籤中這樣對全部項目都生效

<profiles>

      <repositories>

<repository>

<id>shop</id>

<name>倉庫介紹</name>

<url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url>

</repository>

</repositories>

<pluginRepositories>

   <pluginRepository>

   <id>plugin</id>

   <name>插件下載地址</name> <url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url>

   </pluginRepository>

</pluginRepositories>

 </profiles>

l 把本地項目提交到私服中

<distributionManagement>

<repository>

<!-- 要在我的的setting.xml中配置上傳的密碼 -->

<id>snapshots</id>

<name>snapshots 測試版</name>

<!-- nexus中查找相應的地址-->

        <url>http://localhost:8080/nexus/content/repositories

            /snapshots/</url>

</repository>

</distributionManagement>

 

<servers>

    <!-- 在.m2\setting.xml中 配置了要上傳倉庫的密碼 -->

<server>

<id>snapshots</id>

<username>admin</username>

<password>admin123</password>

</server>

<server>

<id>releases</id>

<username>admin</username>

<password>admin123</password>

</server>

  </servers>

1.8. 其它小技巧

1.8.1. 跳過單元測試

你可能想要配置 Maven 使其徹底跳過單元測試。 可能你有一個很大的系統,單元測試須要花好多分鐘來完成,而你不想在生成最終輸出前等單元測試完成。 你可能正工做在一個遺留系統上面,這個系統有一系列的失敗的單元測試,你可能僅僅想要生成一個 JAR 而不是去修復全部的單元測試。 Maven 提供了跳過單元測試的能力

l 採用命令的方式跳過單元測試

$ mvn install -D maven.test.skip=true

l 採用配置的方式跳過單元測試

surefire 插件用來在maven構建生命週期的test 的插件, 若是每次都不須要運行test則經過簡單的配置便可

<build>

<plugins>

<plugin>

<artifactId>maven-surefire-plugin</artifactId>

<version>2.7.1</version>

<configuration>

<skip>true</skip>

</configuration>

</plugin>

</plugins>

</build>

1.8.2. 代碼的方式生成maven骨架

Archetype能夠幫助咱們迅速地構建起項目的骨架,在前面的例子中,咱們徹底能夠在Archetype生成的骨架的基礎上開發Hello World項目以節省大量時間,若是沒有制定packageName則默認與goupId相同

mvn archetype:create -D groupId=com.test.maven -D artifactId=test1 -D packageName=a.b.c

相關文章
相關標籤/搜索