Maven的核心概念(2)

Maven坐标 GAV

    在项目开发中,Maven坐标就是为了定位一个唯一确定的jar包。
我们经常用到的一些开源框架,他们的名称和版本号以及版本的类型就确定了他们的唯一性,我们引用这些开源框架时,就可以通过坐标来指定他们.
    Maven坐标简称GAV
        groupId: 代表当前项目组织名称
        artifactId:代表当前项目名称
        version:  代表当前项目的当前版本

Maven依赖管理

Maven的依赖管理,主要就是在pom.xml文件中定义的项目中需要引用的jar包,其中包括依赖的jar包的GAV坐标,依赖的一些特性.
依赖范围 scope属性:
        Scope属性我们需要了解其中的四种 compile/test/perovided/runtime
        * compile  :编译依赖范围,scope属性的默认值,表示在编译,测试,系统运行时都需要此jar包 .比如:log4j.jar
        * test      :测试依赖范围表示只是在测试的过程中需要用到此jar包.
比如junit.jar
        * provided  :已提供依赖范围,表示在编译,测试时需要用到此jar包,但是在正式的运行环境中,不需要此jar包,因为运行的容器已经提供 比如:servlet-api.jar
        * runtime  :运行时依赖范围,表示只在运行需要用到此jar包 比如:数据库驱动的jar包


依赖传递:
    注意:依赖范围在传递依赖时会略有变化
    * 当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致(log4j.jar);
    * 当第二直接依赖的范围是test的时候,依赖不会得以传递(junit.jar);
    * 当第二直接依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且范围为provided;
    * 当第二直接依赖的范围是runtime的时候,传递性的依赖范围与第一直接依赖的范围一致,但compile例外,此时传递依赖范围为runtime;

这里写图片描述

这里写图片描述

依赖冲突:
    当一个项目中依赖同一个项目构建,但是依赖的是不同的版本的情况下,以在配置文件中的位置最下方的版本为准(覆盖)

    如果直接与间接依赖中包含有同一项目但是不同版本的资源依赖,以直接依赖的版本为准。

    总结:当存在依赖冲突时,以就近原则来解决此类问题(同项目,以配置文件最下面为准/依赖传递就近以直接依赖为准)

这里写图片描述

这里写图片描述

可选依赖
    我们制定某个jar包的依赖时,还有个<optional>属性,默认值为false,如果值为true,则代表这个被引用的jar是可选依赖,不能往下传递.<optional> true/false 是否可选,也可以理解为是否向下传递。

    当我们添加optional属性为true时,maven02虽然依赖maven01项目,但是mave01项目引用的spring-context项目并没有传递给maven02项目.

这里写图片描述

排除依赖
    如果maven02项目依赖maven01项目,但是maven01项目引用的一些jar包,maven02项目不需要,这个时候,可以配置exclusions标签进行排除,这就是排除依赖

这里写图片描述

Maven生命周期

生命周期概念
    Maven生命周期就是项目构建的所有步骤,
    Maven对项目构建所有的步骤进行了抽象和统一。包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤。
    Maven中有三套相互独立的生命周期 
    * Clean Lifecycle: 在进行真正的构建之前进行一些清理工作。 
    * Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等。 
    * Site Lifecycle: 生成项目报告,站点,发布站点。 
    注意:  它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

clean:清理项目

    clean生命周期一共包含了三个阶段: 
    * pre-clean 执行一些需要在clean之前完成的工作 
    * clean 移除所有上一次构建生成的文件 
    * post-clean 执行一些需要在clean之后立刻完成的工作
    注意: 我们在上面的章节运行的mvn clean 执行 等同于mvn pre-clean clean 两个指令的叠加,这是Maven很重要的一个规则,可以大大简化命令行的输入。 



default:构建项目

    Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。整个周期如下:
    validate 
    generate-sources 
    process-sources 
    generate-resources 
    process-resources 复制并处理资源文件,至目标目录,准备打包。 
    compile 编译项目的源代码。 
    process-classes 
    generate-test-sources 
    process-test-sources 
    generate-test-resources 
    process-test-resources 复制并处理资源文件,至目标测试目录。 
    test-compile 编译测试源代码。 
    process-test-classes 
    test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。 
    prepare-package 
    package 接受编译好的代码,打包成可发布的格式,如 JAR 。 
    pre-integration-test 
    integration-test 
    post-integration-test 
    verify 
    install 将包安装至本地仓库,以让其它项目依赖。 
    deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。 

    注意: 我们在执行任何一个阶段的指令的时候,它前面的所有阶段都会被运行,比如: 运行mvn install 的时候,代码会被编译,测试,打包。


site:生成项目站点(了解)

    Site生命周期主要用来生成和发布maven站点 ,开发人员很少用到,有特殊要求的项目经理可以通过它来自动生成文档和统计数据,主要阶段如下.
    * pre-site 执行一些需要在生成站点文档之前完成的工作 
    * site 生成项目的站点文档 
    * post-site 执行需要在生成站点文档之后完成的工作,并且为部署做准备 
    * site-deploy 将生成的站点文档部署到特定的服务器上 

Maven插件

Maven仅仅定义了抽象的生命周期,具体的任务都是交由对应的插件完成的。每个插件都能实现一个生命周期里面的过程。Maven的生命周期与插件目标相互绑定,以完成某个具体的任务。
比如:compile就是插件maven-compiler-plugin的一个插件目标

Maven编译插件

    当我们需要指定某个项目以什么JDK的版本进行编译时,可以在pom.xml文件上指定JDK版本
    注意:修改配置文件后,需要右击工程 选择maven→update project configration

这里写图片描述

WEB容器插件(Tomcat)

使用maven创建一个web工程
    第一步:不选用骨架
    第二步:将打包方式选择为war
    第三步:点击finish,工程创建成功。
    第四步:在工程中添加web.xml
    第五步:在webapp下创建index.jsp
    第六布:在pom.xml文件里面引入servlet-api.jar

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

运行tomcat插件
    tomcat:run   运行tomcat6(默认)版本太低,不建议
    tomcat7:run 运行tomcat7(推荐,但是需要添加插件)
    也可以直接用外部tomcat直接运行。

这里写图片描述

这里写图片描述

<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.tz</groupId>
  <artifactId>maven03</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>maven03 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

     <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
        <scope>provided</scope>
    </dependency>


  </dependencies>
  <build>
    <finalName>maven03</finalName>
    <plugins>
        <!--引入maven的tocmat容器插件  -->
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <configuration>
                <port>8080</port>
                <path>/</path>
            </configuration>
        </plugin>

    </plugins>
  </build>
</project>

Maven父子继承

    通过上面maven依赖管理的学习,我们可以知道,maven工程之间的依赖关系是可以传递的.
    通过依赖关系的传递,我们可以将不同项目中间相同的配置提取出来,放到统一放到一个父工程,然后其他工程作为子工程继承父工程的一些公用配置。

创建父工程

这里写图片描述

这里写图片描述

这里写图片描述

创建子工程


    创建新工程为子工程,在创建时设置父工程的GAV。
    将现有工程继承父工程只需要在pom文件中添加parent节点即可。
    将现有工程继承父工程只需要在pom文件中添加parent节点即可。

这里写图片描述

父工程统一依赖jar包

在父工程中对jar包进行依赖,在子工程中都会继承此依赖。

这里写图片描述

父工程统一管理版本号

Maven使用dependencyManagement管理依赖的版本号。
注意:此处只是定义依赖jar包的版本号,并不实际依赖。如果子工程中需要依赖jar包还需要添加dependency节点。

父工程中版本号提取

当父工程中定义的jar包越来越多,找起来越来越麻烦,所以可以把版本号提取成一个属性集中管理。

这里写图片描述

Maven聚合工程

聚合一般是一个工程拆分成多个模块工程进行开发,每个模块是一个独立的工程,但是要是运行时必须把所有模块聚合到一起才是一个完整的工程,此时可以使用maven的聚合工程。
比如:按功能模块划分(framework模块/系统管理/各个业务模块/)可以对不同的模块单独创建工程,最终在打包时,将不同的模块聚合到一起。
比如: 按MVC开发模式划分 ,将controller /service/dao按照分层创建不同的工程,最终在打包时,将不同的模块聚合到一起。

创建一个聚合工程

聚合工程的打包方式必须是pom,一般聚合工程和父工程合并为一个工程。

这里写图片描述

这里写图片描述

创建持久层工程

第一步:在maven-web工程上,点击new -> project

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

创建业务层工程

    同理,根据上面过程建立业务逻辑处理(Service)工程

这里写图片描述

创建controller工程(注意:controller是个javaWeb项目)

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

修改web.xml和index.jsp 引入servlet-api

聚合之后的maven06Main工程的pom文件内容如下:

这里写图片描述

运行聚合工程

在主工程pom.xml文件中指定tomcat运行插件
Run as tomcat7:run
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值