maven学习总结

一、Maven坐标

1. 主要组成
  • groupId:组织标志(包名)
  • artifactId:项目名称
  • version:项目的当前版本
  • packaging:项目的打包方式,主要是jar和war两种
2. maven为什么要使用坐标
  • Maven世界拥有大量构建,我们需要
    通过唯一的标识来构建一个统一规范
  • 拥有了统一规范就可以把查找的工作交给软件自己去查找执行

二、依赖管理

2.1 依赖配置

依赖配置的格式如下:

<!--添加依赖配置-->
    <dependencies>
        <!--项目要使用到junit的jar包,所以在这里添加junit的jar包的依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
        <!--项目要使用到Hello的jar包,所以在这里添加Hello的jar包的依赖-->
        <dependency>
            <groupId>me.gacl.maven</groupId>
            <artifactId>Hello</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>    
    </dependencies>
2.2 依赖范围

依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系。主要的是三种依赖关系:
* compile: 默认编译依赖范围。对于编译、测试、运行三种classpath都有效
* test: 测试依赖范围。只对于测试的classpath有效
* provided: 已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为容器已经提供,例如servlet-api
* runtime: 运行时提供。例如:jdbc驱动

三、 仓库管理

3.1 Maven 仓库

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

3.2 Maven仓库布局

根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:groupId/artifactId/version/artifactId-version.packaging

3.3 仓库的分类
3.3.1 本地仓库

每个用户都拥有本地仓库,默认是在~/.m2/repository/,~代表的是用户目录

3.3.2 远程仓库
  1. 中央仓库:Maven默认的远程仓库,地址 http://search.maven.org/
  2. 私服: 是一种特殊的远程仓库,它是架设在局域网内的仓库。

四、 生命周期

4.1 什么是maven的生命周期?

maven生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理、初始化、编译、打包、测试、部署等几乎所有的构建步骤

4.2 Maven三大生命周期

Maven 有三套相互独立的生命周期,分别是:
1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
2. Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
3. Site Lifecycle 生成项目报告,站点,发布站点。

在是使用 mvn clean install site 运行所有这三套生命周期。

Clean生命周期包括三个阶段:
1. pre-clean 执行一些需要在clean之前完成的工作
2. clean 移除所有上一次构建生成的文件。
3. post-clean 执行一些需要在clean之后完成的工作

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

  1. site生成项目的站点文档
  2. post-site 执行一些需要在站点文档生成之后完成的工作,并且为部署做准备
  3. site-deploy 将生成的站点文档部署到特定的服务器上。

这里经常用到的site阶段和site-deploy阶段,用以生成和发布maven站点,这个maven功能相当强大。Manager能生成比较好看的文档以及统计数据。
Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大多数工作都发生在这个生命周期中。

解释一些比较重要和常用的阶段。

  1. process-resources 复制并处理资源文件至目标目录,准备打包。
  2. compile 编译项目的源代码
  3. process-test-resources 复制并处理资源文件,至目标测试目录
  4. test-compile 编译测试源代码
  5. test 使用合适的单元测试框架进行测试,这些测试代码不会被打包或部署。
  6. package 接受编译好的代码,打包成可发布的格式,如jar
  7. install 将包安装至本地仓库,以让其他项目依赖。
  8. deploy 将最终的包复制到远程的仓库,以让其他开发人员与项目共享。

五、Maven 插件

  1. Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的
  2. 每个插件都能实现多个功能,每个功能就是一个插件的目标。
  3. Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务,例如compile就是插件 maven-compiler-plugin的一个插件目标

六、 聚合和集成

聚合

maven允许我们一次构建多个项目模块,那我们就需要对多个项目模块进行聚合
1. 聚合代码配置

 <modules>
    <module>模块一</module>
    <module>模块二</module>
    <module>模块三</module>
 </modules>

例如:对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合

 <modules>
    <module>../Hello</module>
    <module>../HelloFriend</module>
    <module>../MakeFriends</module>
 </modules>
继承

继承为了消除重复,我们把很多相同的配置提取出来,例如:groupId、version等

  1. 继承代码配置
<parent>
    <groupId></groupId>
    <artifactId></artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../ParentProject/pom.xml</relativePath>
</parent>
  1. 继承代码过程中,可以定义属性,例如:
<propertied>
    <project.build.sourceEncoding>UTF—8</project.build.sourceEncoding>
    <junit.version>4.9</junit.version>
    <maven.version>0.0.1-SNAPSHOT</maver.version>
<propertied>

访问属性的方式为 ${junit.version},例如:

 <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
 </dependency>
  1. 父模块用dependencyManagement进行管理
 <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>    
        <dependency>
            <groupId>cn.itcast.maven</groupId>
            <artifactId>HelloFriend</artifactId>
            <version>${maven.version}</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
   </dependencies>
</dependencyManagement>

这样的好处是子模块可以有选择性的进行继承,而不是要全部继承。

  1. 聚合和继承的作用
    聚合主要是为了快速构建项目,继承主要为了消除重复
聚合与继承实战演练

创建四个Maven项目

image

这四个项目放在同一个目录下,方便聚合和继续

image

Parent项目是其它三个项目的父项目,主要是用来配置一些公共的配置,其它三个项目再通过继承的方式拥有Parent项目中的配置,首先配置Parent项目的pom.xml,添加对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合以及jar包依赖,pom.xml的配置信息如下:

Parent项目的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>me.gacl.maven</groupId>
    <artifactId>Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

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

    <!-- 对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合 -->
    <modules>
        <module>../Hello</module>
        <module>../HelloFriend</module>
        <module>../MakeFriends</module>
    </modules>

    <!-- 定义属性 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>4.9</junit.version>
        <maven.version>0.0.1-SNAPSHOT</maven.version>
    </properties>

    <!-- 用dependencyManagement进行jar包依赖管理 -->
    <dependencyManagement>
        <!-- 配置jar包依赖 -->
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <!-- 访问junit.version属性 -->
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>me.gacl.maven</groupId>
                <artifactId>Hello</artifactId>
                <!-- 访问maven.version属性 -->
                <version>${maven.version}</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>me.gacl.maven</groupId>
                <artifactId>HelloFriend</artifactId>
                <!-- 访问maven.version属性 -->
                <version>${maven.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

 在Hello项目的pom.xml中继承Parent项目的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>
  <artifactId>Hello</artifactId>

      <!-- 继承Parent项目中的pom.xml配置 -->
       <parent>  
          <groupId>me.gacl.maven</groupId>
         <artifactId>Parent</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <!-- 使用相对路径 -->
        <relativePath>../Parent/pom.xml</relativePath>  
    </parent>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
</project>

在HelloFriend项目的pom.xml中继承Parent项目的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>
    <artifactId>HelloFriend</artifactId>
    <name>HelloFriend</name>

    <!-- 继承Parent项目中的pom.xml配置 -->
    <parent>
        <groupId>me.gacl.maven</groupId>
        <artifactId>Parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../Parent/pom.xml</relativePath>
    </parent>
    <dependencies>
        <dependency>
            <!-- Parent项目的pom.xml文件配置中已经指明了要使用的Junit的版本号,因此在这里添加junit的依赖时,
            可以不指明<version></version>和<scope>test</scope>,会直接从Parent项目的pom.xml继承 -->
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <!-- HelloFriend项目中使用到了Hello项目中的类,因此需要添加对Hello.jar的依赖 
        Hello.jar的<version>和<scope>也已经在Parent项目的pom.xml文件配置中已经指明了
        因此这里也可以省略不写了
        -->
        <dependency>
            <groupId>me.gacl.maven</groupId>
            <artifactId>Hello</artifactId>
        </dependency>
    </dependencies>
</project>

在MakeFriends项目的pom.xml中继承Parent项目的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>
    <artifactId>MakeFriends</artifactId>
    <!-- 继承Parent项目中的pom.xml配置 -->
    <parent>
        <groupId>me.gacl.maven</groupId>
        <artifactId>Parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../Parent/pom.xml</relativePath>
    </parent>
    <dependencies>
        <dependency>
        <!-- Parent项目的pom.xml文件配置中已经指明了要使用的Junit的版本号,因此在这里添加junit的依赖时,
            可以不指明<version></version>和<scope>test</scope>,会直接从Parent项目的pom.xml继承 -->
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
        <!-- MakeFriends项目中使用到了HelloFriend项目中的类,因此需要添加对HelloFriend.jar的依赖 
        HelloFriend.jar的<version>和<scope>也已经在Parent项目的pom.xml文件配置中已经指明了
        因此这里也可以省略不写了
        -->
            <groupId>me.gacl.maven</groupId>
            <artifactId>HelloFriend</artifactId>
        </dependency>
    </dependencies>
</project>

以上的四个项目的pom.xml经过这样的配置之后,就完成了在Parent项目中聚合Hello、HelloFriend、MakeFriends这三个子项目(子模块),而Hello、HelloFriend、MakeFriends这三个子项目(子模块)也继承了Parent项目中的公共配置,这样就可以使用Maven一次性构建所有的项目了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值