Maven

本文详细介绍Maven作为项目管理工具的功能,包括构建自动化、依赖管理、生命周期等关键概念,以及Maven与Eclipse的整合,如何创建和配置Maven项目,通过两个实例展示Maven在项目中的应用。

什么是maven?

翻译为“专家”,“内行”

Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建依赖管理和项目信息管理。

什么是理想的项目构建?

高度自动化,跨平台,可重用的组件,标准化的

什么是依赖?为什么要进行依赖管理?

自动下载,统一依赖管理

有哪些项目信息?

项目名称描述等,开发人员信息,开发者信息等

什么是构建?

 

Maven模型

 主要内容:

为什么使用Maven

Maven安装与配置

第一个Maven项目

Maven相关概念介绍

MavenEclipse整合

建立Maven私服-Nexus

 部署构建至Nexus

为什么使用Maven

IDEEclipse

手工操作较多,编译、测试、部署等工作都是独立的,很难一步完成

每个人的IDE配置都不同,很容易出现本地代码换个地方编译就出错

Ant

没有一个约定的目录结构

必须明确让ant做什么,什么时候做,然后编译,打包

没有生命周期,必须定义目标及其实现的任务序列

没有集成依赖管理

Maven

拥有约定,知道你的代码在哪里,放到哪里去

拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程

只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情

拥有依赖管理,仓库管理

安装Maven

确认jdk是否已安装?

下载Maven

地址:http://maven.apache.org/download.html

版本:Maven3.0.5

安装Maven

Maven安装过程文档

Maven安装目录分析

bin:含有mvn运行的脚本

boot:含有plexus-classworlds类加载器框架

conf:含有settings.xml配置文件

lib:含有Maven运行时所需要的java类库

LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍

初始配置

设置MAVEN_HOME环境变量

    •升级时只需要下载最新版本,解压缩后重新设置MAVEN_HOME环境变量即可

设置MAVEN_OPTS环境变量

    •-Xms128m -Xmx512m

配置用户范围的settings.xml

    •MAVEN_HOME/conf/settings.xml 全局的

    •~/.m2/settings.xml

        •默认仓库:当前用户路径C:\Users\[UserName]\.m2

        •localRepository:用户仓库,用于检索依赖包路径

用户Maven依赖包路径层次目录

    •settings.xml文件必须与maven安装路径下的内容保持一致

    •配置中设置路径指向仓库目录

    •<localRepository>D:\maven\repository</localRepository>

    •注意:

        •用户级别的仓库在全局配置中一旦设置,全局配置将不再生效,转用用户所设置的仓库,否则使用默认路径仓库

遵从Maven约定:

src/main/java —— 存放项目的.java文件

src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件

src/test/java —— 存放所有测试.java文件,如JUnit测试类

src/test/resources —— 测试资源文件

target —— 项目输出位置

pom.xml——maven项目核心配置文件

Maven项目:

详见第一个Maven项目

详见第二个Maven项目

 

MavenEclipse整合

如何使用?

   •新建项目

   •导入Maven项目

   •执行mvn命令

Maven核心概念

坐标

依赖管理

仓库管理

生命周期

插件和目标

聚合继承

Maven 坐标:

什么是坐标?

          •在平面几何中坐标(x,y)可以标识平面中唯一的一点

Maven坐标主要组成

         •groupId:定义当前Maven项目隶属项目

          •artifactId:定义实际项目中的一个模块

          •version:定义当前项目的当前版本

          •packaging:定义该项目的打包方式

Maven为什么使用坐标?

          •Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范

           •拥有了统一规范,就可以把查找工作交给机器

依赖管理-依赖范围:

依赖管理:

如何进行依赖配置?

传递性依赖和可选依赖,排除依赖

http://mvnrepository.com/

依赖管理-依赖范围:

其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:

 

1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效

2.test:测试依赖范围。只对于测试classpath有效

3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api

4.runtime:运行时提供。例如:jdbc驱动

依赖管理-传递依赖:

依赖管理-依赖范围对传递依赖的影响:

列是第一直接依赖,行是第二间接依赖

依赖管理:

1.如何进行依赖配置?

传递性依赖和可选依赖,排除依赖

<optional> true/false 是否向下传递

2.如何进行依赖配置?

传递性依赖和可选依赖,排除依赖

<exclusions>

  <exclusion>

  所包含坐标

排除依赖包中所包含的依赖关系

不需要添加版本,直接类别排除

3.依赖冲突

如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准(就近原则)

如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准(就近原则)

生命周期

1.何为生命周期?

Maven生命周期就是为了对所有的构建过程进行抽象和统一

包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤

2.Maven三大生命周期

clean:清理项目的

default:构建项目的

site:生成项目站点的

3.生命周期Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。

Site Lifecycle 生成项目报告,站点,发布站点。

再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

生命周期clean

clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的cleanClean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

pre-clean 执行一些需要在clean之前完成的工作

clean 移除所有上一次构建生成的文件

post-clean 执行一些需要在clean之后立刻完成的工作

mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-cleanclean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。

生命周期default

Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:

validate

generate-sources

process-sources

generate-resources

process-resources 复制并处理资源文件,至目标目录,准备打包。

compile 编译项目的源代码。

process-classes

generate-test-sources

process-test-sources

lgenerate-test-resources

process-test-resources 复制并处理资源文件,至目标测试目录。

test-compile 编译测试源代码。

process-test-classes

test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。

lprepare-package

package 接受编译好的代码,打包成可发布的格式,如 JAR

pre-integration-test

lintegration-test

post-integration-test

verify

install 将包安装至本地仓库,以让其它项目依赖。

deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。

生命周期site

Site生命周期pre-site 执行一些需要在生成站点文档之前完成的工作

site 生成项目的站点文档

post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备

site-deploy 将生成的站点文档部署到特定的服务器上

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。

插件目标

Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的

每个插件都能实现多个功能,每个功能就是一个插件目标

Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务

         例如compile就是插件maven-compiler-plugin的一个插件目标

<build>

  <plugins>

  <plugin>

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

  <artifactId>maven-source-plugin</artifactId>

        <version>2.2.1</version>

        <executions>

              <execution>

  <goals>

  <goal>jar-no-fork</goal>

              </goals>

              <phase>verify</phase>

  </execution>

      </executions>

    </plugin>

  </plugins>

</build>

继承

何为继承?

继承为了消除重复,我们把很多相同的配置提取出来

例如:grouptIdversion

父工程设置为被继承

<packaging>pom</packaging>

子工程继承父工程

省略父工程中定义的坐标除访问名称中的所有设定,添加继承父工程

<parent>

  <groupId>…</groupId>

  <artifactId>… </artifactId>

  <version>… </version>

  <relativePath>../父工程项目名</relativePath>

</parent>

 

          父工程统一管理子工程依赖版本

          <dependencyManagement

          <dependencies>

                //添加公共依赖包

           </dependencies>

           </dependencyManagement>

            子工程仅仅添加依赖包,无需添加版本,版本由父工程继承而来

           为了进一步便于管理,将所有的版本管理设置在一起,设置为系统属性值

          <properties>

            <junit.version>4.9</junit.version>

            ……

           </properties>

           引用使用${junit.version}格式进行,只能在依赖范围设置

 

          父工程统一管理子工程依赖关系

          如果所有子工程都需要依赖某些包,父工程可以通过设置依赖,将依赖关系传递到子工程中

          <dependencies>

               //添加公共依赖包

           </dependencies>

聚合

何为聚合?

如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合

<modules>

  <module>../子项目名称1</module>

  <module>../子项目名称2</module>

   <module>../子项目名称3</module>

</modules>

 

聚合与继承的关系

聚合主要为了快速构建项目

继承主要为了消除重复

 

仓库管理

何为Maven仓库?

          •用来统一存储所有Maven共享构建的位置就是仓库

Maven仓库布局

          •根据Maven坐标定义每个构建在仓库中唯一存储路径

          •大致为:groupId/artifactId/version/artifactId-version.packaging

仓库的分类

         •本地仓库

                  •~/.m2/repository/

                 •每个用户只有一个本地仓库

         •远程仓库

                 •中央仓库:Maven默认的远程仓库,不包含版权资源

                         •http://repo1.maven.org/maven2

                 •私服:是一种特殊的远程仓库,它是架设在局域网内的仓库

 

Maven私服:

什么是私服?

为什么使用Nexus私服软件?

Nexus安装与使用

Nexus的仓库和仓库组

宿主仓库

代理仓库

仓库组

配置MavenNexus下载,部署构建



Maven安装

1.检查jdk安装的情况(1.6版本):

Echo %JAVA_HOME%

Java -version

2.对apache-maven-3.0.3-bin.zip进行解压缩,例如解压到如下目录(解压目录最好不要有中文字):

3.设置系统环境变量,MAVEN_HOME

 

4.设置环境变量Path,将%MAVEN_HOME%\bin加入Path中,一定要注意要用分号;与其他值隔开

 

5.验证安装是否成功,打开cmd窗口,敲入mvn –v 查看



 第一个maven项目

第一步. 首先建立MavenHelloWorld项目同时建立Maven约定的目录结构

MavenHelloWorld
     src
         main
             java
             resources(暂时省略)
     test
             java
             resources(暂时省略)
     pom.xml

第二步:在src/main/java/cn/itcast/maven目录下新建文件Hello.java

package cn.itcast.maven;

public class HelloWorld {
    public String sayHello(String name){
        return "Hello World :" + name + "!";
    }
}

第三步:在/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("maven");
        assertEquals("Hello maven!",results);        

    }
    
}

第四步:在项目MavenHelloWorld根目录建立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">
  <!-- 版本:4.0.0 -->
  <modelVersion>4.0.0</modelVersion>
  <!-- 组织名称:暂时使用 组织名称+项目名称 作为组织名称 -->
  <!-- 组织名称:实际名称 按照访问路径规范设置,通常以功能作为名称:eg: junit spring -->
  <groupId>cn.itcast.maven</groupId>
  <!-- 项目名称 -->
  <artifactId>HelloWorld</artifactId>
  <!-- 当前项目版本号:同一个项目开发过程中可以发布多个版本,此处标示0.0.1版 -->
  <!-- 当前项目版本号:每个工程发布后可以发布多个版本,依赖时调取不同的版本,使用不同的版本号 -->
  <version>0.0.1</version>
  <!-- 名称:可省略 -->
  <name>Hello</name>
 
  <!-- 依赖关系 -->
    <dependencies>
        <!-- 依赖设置 -->
        <dependency>
            <!-- 依赖组织名称 -->
            <groupId>junit</groupId>
            <!-- 依赖项目名称 -->
            <artifactId>junit</artifactId>
            <!-- 依赖版本名称 -->
            <version>4.9</version>
            <!-- 依赖范围:test包下依赖该设置 -->
            <scope>test</scope>
        </dependency>        
        
    </dependencies>
</project>


第五步:

a)打开cmd命令行,进入Hello项目根目录(包含有pom.xml文件的目录)
b)执行 mvn compile命令
    执行完毕后,生成了maven工程编译完成后字节码文件的生成目录target
c)cmd 中继续录入mvn clean命令
    执行完毕后,字节码生成目录被删除
d)cmd 中录入 mvn clean test命令
    执行完毕后,字节码生成目录中生成了被测试类与测试类的编译字节码和测试执行过程日志与详细报告
e)cmd 中录入 mvn clean compile命令
    组合指令,先执行clean,再执行compile,通常应用于上线前执行,清除测试类
f)cmd 中录入 mvn clean test命令
    组合指令,先执行clean,再执行test,通常应用于测试环节
g)cmd 中录入 mvn clean package命令
    组合指令,先执行clean,再执行package,将项目打包,通常应用于发布前
    执行过程:
        清理————清空环境
        编译————编译源码
        测试————测试源码
        打包————将编译的非测试类打包
h)cmd 中录入 mvn clean install 查看仓库,当前项目被发布到仓库中
    组合指令,先执行clean,再执行install,将项目打包,通常应用于发布前
    执行过程:
        清理————清空环境
        编译————编译源码
        测试————测试源码
        打包————将编译的非测试类打包
        部署————将打好的包发布到资源仓库中
-----------------------------------------------------------------
错误范例:
说明:MAVEN 命令输入错误,命令名称显示在[ERROR] Unknown lifecycle phase "compoile"
引号中的内容为输入错误的名称
[ERROR] Unknown lifecycle phase "compoile". You must specify a valid lifecycle p
hase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin
-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validat
e, initialize, generate-sources, process-sources, generate-resources, process-re
sources, compile, process-classes, generate-test-sources, process-test-sources,
generate-test-resources, process-test-resources, test-compile, process-test-clas
ses, test, prepare-package, package, pre-integration-test, integration-test, pos
t-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-s
ite, site, post-site, site-deploy. -> [Help 1]


 第二个maven项目


第六步:新建第二个项目模块HelloFriend目录及约定的目录结构

HelloFriend
     src
         main
             java
             resources(暂时省略)
     test
             java
             resources(暂时省略)
     pom.xml

第七步:在项目HelloFriend根目录建立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>0.0.1-SNAPSHOT</version>
  <name>HelloFriend</name>
 
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>        
        
        <dependency>
            <groupId>itcast</groupId>
            <artifactId>HelloWorld</artifactId>
            <version>0.0.1</version>
            <scope>compile</scope>
        </dependency>        
    </dependencies>
</project>

第八步:在src/main/java/cn/itcast/maven目录下新建文件HelloFriend.java

package cn.itcast.maven;

import cn.itcast.maven.HelloWorld;

public class HelloFriend {

    public String sayHelloToFriend(String name){
        HelloWorld hw = new HelloWorld();
        String str = hw.sayHello(name)+" I am "+this.getMyName();
        System.out.println(str);
        return str;
    }
    
    public String getMyName(){
        return "MAVEN";
    }

}

第九步:在/src/test/java/cn/itcast/maven目录下新建测试文件HelloFriendTest.java
package cn.itcast.maven;

import static junit.framework.Assert.assertEquals;

import org.junit.Test;

import cn.itcast.maven.Hello;


public class HelloFriendTest {
    @Test
    public void tesHelloFriend(){
        HelloFriend helloFriend = new HelloFriend();
        String results = helloFriend.sayHelloToFriend("Jock");
        assertEquals("Hello World Jock! I am MAVEN",results);        
    }
}

第十步:在HelloFriend目录下执行命令mvn package

系统报错说没有找到依赖

第十一步:需要重新构建HelloWorkd第一个项目并安装到数据仓库,在命令行HelloWorkd根目录下执行mvn clean install

第十二步:重新在HelloFriend目录下执行命令mvn package

成功

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值