Maven小结

1、引言

很早之前就学了Maven,日常中使用Maven总是那么几个简单的jar包管理功能,或者子父模块功能。今天呢,借着闲暇时间来总结一下Maven,多以项目开发中常用到功能为主。。也方便日后前来温习。^_^

Maven易百教程:https://www.yiibai.com/maven/

2、Maven简介

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期。
在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。

2.1、Maven项目的目录约定

MavenProjectRoot(项目根目录)
   |----src
   |     |----main
   |     |         |----java ——存放项目的.java文件
   |     |         |----resources ——存放项目资源文件,如spring, hibernate配置文件
   |     |----test
   |     |         |----java ——存放所有测试.java文件,如JUnit测试类
   |     |         |----resources ——存放项目资源文件,如spring, hibernate配置文件
   |----target ——项目输出位置
   |----pom.xml ----用于标识该项目是一个Maven项目

setting.xml元素解读: https://www.cnblogs.com/yangxia-test/p/4409736.html

 pom.xml元素解读: http://www.cnblogs.com/hafiz/p/5360195.html

2.2、Maven优点

1)平时我们开发项目时,一般都是一个项目就是一个工程。我们划分模块时,都是使用package来进行划分。但是,当项目很大时,有很多子模块时,即使是package来进行划分,也是让人眼花缭乱。

            优点一:项目非常大时,可借助Maven将一个项目拆分成多个工程,最好是一个模块对应一个工程,利于分工协作。而且模块之间还是可以发送消息的。


(2)同一项目的jar包  复制 和 粘贴到WEB/INF/lib下
                问题:同样的jar包重复出现在不同的工程中,一方面浪费空间,同时也让工程臃肿

优点二:借助Maven,可将jar包仅仅保存在“仓库”中,有需要该文件时,就引用该文件接口,不需要复制文件过来占用空间。


(3)如果jar包都到各个官网网站下载,会浪费很多时间,而且可能不全。

优点三:借助Maven可以以规范的方式下载jar包,因为所有的知名框架或第三方工具的jar包已经按照统一的规范存放到了Maven的中央仓库中。


(4)一个jar包依赖的其他jar包可能没导入到项目而导致项目跑不起来。

优点四:Maven会自动将你要加入到项目中的jar包导入,不仅导入,而且还会将该jar包所依赖的jar包都自动导入进来。而且是导入该包的最新版本

Apache Maven与Apache ant区别

maven、ant、svn的区别

- maven与ant之间的区别

           都是软件构建工具、软件管理工具、   

   Apache Ant
         • Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪里去找源代码,哪里放置输出

        • Ant 是程序化的,你必须明确的告诉 Ant 做什么,什么时候做。你必须告诉它去编译,然后复制,然后压缩。

        • Ant 没有生命周期,你必须定义目标和目标之间的依赖。你必须手工为每个目标附上一个任务序列。
   Apache Maven

        约定大于配置

   maven优点:

        - jar包声明式依赖

        - jar包仓库

- maven 与svn的区别

         1.maven 软件构建工具,是软件源码已经完毕,需要构建,需要部署与发布

         2. svn 是版本控制工具,是协同开发工具

    svn 仓库 :

           1. 项目源码保存

           2. 历史版本的备份

           3. 每一次版本的修改情况

      需求: maven(ant)+svn(git)

2.2、Maven坐标

Maven的一大功能是管理项目依赖。为了能自动化地解析任何一个Java构件(jar/war),Maven就必须将它们唯一标识,这就是依赖管理的底层基础——坐标。 

<dependency>
  <groupId>org.springframework</groupId>一般为包名
  <artifactId>spring-core</artifactId>一般为模块名及其子模块名
  <version>4.2.6.RELEASE</version>版本
</dependency>

2.3、Maven生命周期

我们在开发项目的时候,不断地在编译、测试、打包、部署等过程,maven的生命周期就是对所有构建过程抽象与统一,生命周期包含项目的清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成等几乎所有的过程。

Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,初学者容易将Maven的生命周期看成一个整体,其实不然。这三套生命周期分别是:

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

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

•    SiteLifecycle 生成项目报告,站点,发布站点。

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

每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。maven中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些goal进行各种处理。这个也是maven的一个基本调度机制。

每套生命周期还可以细分成多个阶段。

Clean生命周期

Clean生命周期一共包含了三个阶段:

Clean生命周期 
pre-clean执行一些需要在clean之前完成的工作
clean移除所有上一次构建生成的文件
post-clean执行一些需要在clean之后立刻完成的工作

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


Default生命周期

Maven最重要就是的Default生命周期,也称构建生命周期,绝大部分工作都发生在这个生命周期中,每个阶段的名称与功能如下::

Default生命周期 
validate

验证项目是否正确,以及所有为了完整构建必要的信息是否可用

generate-sources生成所有需要包含在编译过程中的源代码
process-sources处理源代码,比如过滤一些值
generate-resources生成所有需要包含在打包过程中的资源文件
process-resources复制并处理资源文件至目标目录,准备打包
compile编译项目的源代码
process-classes

后处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement)

generate-test-sources生成所有包含在测试编译过程中的测试源码
process-test-sources处理测试源码,比如过滤一些值
generate-test-resources生成测试需要的资源文件
process-test-resources复制并处理测试资源文件至测试目标目录
test-compile编译测试源码至测试目标目录
test

使用合适的单元测试框架运行测试。这些测试应

该不需要代码被打包或发布

prepare-package

在真正的打包之前,执行一些准备打包必要的操

package

将编译好的代码打包成可分发的格式,如

JAR,WAR,或者EAR

pre-integration-test

执行一些在集成测试运行之前需要的动作。如建

立集成测试需要的环境

integration-test

如果有必要的话,处理包并发布至集成测试可以

运行的环境

post-integration-test

执行一些在集成测试运行之后需要的动作。如清

理集成测试环境

verify执行所有检查,验证包是有效的,符合质量规范
install

安装包至本地仓库,以备本地的其它项目作为依

赖使用

deploy

复制最终的包至远程仓库,共享给其它开发人员

和项目(通常和一次正式的发布相关)

可见,构建生命周期被细分成了22个阶段,但是我们没必要对每个阶段都了如指掌,经常关联使用的只有process-test-resources、test、package、install、deploy等几个阶段而已。

一般来说,位置稍后的过程都会依赖于之前的过程。这也就是为什么我们运行“mvn install” 的时候,代码会被编译,测试,打包。当然,maven同样提供了配置文件,可以依照用户要求,跳过某些阶段。比如有时候希望跳过测试阶段而直接install,因为单元测试如果有任何一条没通过,maven就会终止后续的工作。

Site生命周期

Site生命周期

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

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这是Maven相当强大的功能。

2.4、中心仓库、本地仓储、私服

几个概念的关系:中心仓库、本地仓储、私服等几个概念的关系如下图所示

 

3、功能说明

主要功能:项目构建,项目依赖,继承聚合,版本控制。因此今天这里讲的呢主要以功能为主,如果有需要了解Maven基础使用,安装下载以及仓库修改等操作的话可以观看:https://blog.csdn.net/i168wintop/article/details/79372054

3.1、Java项目和不带框架web项目:

这里呢没什么可将的,值得注意的是在新建Maven那里可以不使用Maven提供的模板,也可以使用,反正我是不习惯模板生成的目录,一般都不使用模板。如果有不懂得小伙伴可以参考这篇文章:https://blog.csdn.net/qiyei2009/article/details/66976173

自用:https://blog.csdn.net/qiyei2009/article/details/66976173https://blog.csdn.net/MaNongXf/article/details/83418353

3.2、springboot项目:

3.3、springclound项目:

3.4、子模块,父模块项目构建:

3.2,3.3,3.4,以后更新

 

4、项目依赖

4.1、依赖配置

  1. groupId、artifactId、version是依赖的基本坐标,缺一不可。
  • type:依赖的类型,
  1. 对应坐标packaging,默认为jar
  2. <type>pom.lastUpdated</type>  表示使用最后更新,将不使用jar包,目前没用。
  1. optional:标记依赖是否可选。默认值false
    1. A->B->C,那么当A依赖于C时就可以设为可选。
  2. exclusions:排除传递依赖,解决jar冲突问题。
    1. 例如:spring bean 和 struts2 spring plugin
  3. scope:依赖范围
    1. compile:编译范围,默认scope,在classpath中存在
    2. provided:已提供范围,比如容器提供Servlet API
    3. runtime:运行时范围,编译不需要,接口与实现分离
    4. test:测试范围,单元测试环境需要
  4. system:系统范围,自定义构件,指定systemPath

4.2、依赖传递(依赖jar包冲突的排除)

打开pom.xml文件点击下面的Dependency Hierarchy选项选中冲突的其中一个版本的jar 右键 ---> Exclude Maven Artifact...然后再到pom.xml选项中将误选的另一个jar包的配置代码片段:

<exclusions>

          <!-- 排除 struts spring 插件 使用 spring core -->

          <exclusion>

             <artifactId>spring-core</artifactId>

             <groupId>org.springframework</groupId>

        </exclusion>

   </exclusions>

删除掉即可。例如:spring beans 依赖 spring core使用 3.2.0 版本 而struts spring插件 依赖 spring core 使用 3.0.5 版本 默认情况配置在上面优先,开发中需要通过排除依赖,确定使用版本。

<dependencies>

<!-- 使用 struts插件 -->

<dependency>

<groupId>org.apache.struts</groupId>

<artifactId>struts2-spring-plugin</artifactId>

<version>2.3.15.3</version>

<exclusions>

<!-- 排除 struts spring 插件 使用 spring core -->

<exclusion>

<artifactId>spring-core</artifactId>

<groupId>org.springframework</groupId>

</exclusion>

</exclusions>

</dependency>

<!-- 使用 spring bean -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</artifactId>

<version>3.2.0.RELEASE</version>

//此处要删除的的误排除依赖的代码片段。很多情况下都会出现该种情况要注意!

<!--

<exclusions>

<!-- 排除 struts spring 插件 使用 spring core -->

<exclusion>

<artifactId>spring-core</artifactId>

<groupId>org.springframework</groupId>

</exclusion>

</exclusions>

-->

</dependency>

</dependencies>

4.3、依赖范围

1.Maven项目在编译、运行和测试使用了三种不同的classpath

    2.scope 用于确定maven执行 classpath 使用哪些 jar包

1 compile 编译、测试、运行 当前依赖jar都使用。默认值,一般适用于大部分情况。

2 test:测试时使用。例如:Junit

3 provided:编译、测试,注意:运行时没有。例如:servlet-api、jsp-api

       servlet源码: 编写时,MyEclipse提供jar包

     注意:使用Maven开发时是没有使用MyEclipse提供的servlet-api.jar 和 jsp-api.jar的所以必须要添加该两个jar包的依赖坐标并且scope的值一定为provided 因为运行的时候tomcat提供了该两个jar包没有设置<scope>provide</scope>的话会引起冲突。

4 runtime 测试和运行时使用,编译不使用。适合接口开发。例如:JDBC驱动。

5 system 从本地操作系统获得指定jar包,不依赖maven环境。不建议使用,不稳定。

4.4、依赖调节

  •  第一原则:路径近者优先原则
  •     第二原则:第一声明者优先原则当路径相等时,则由POM声明的依赖顺序决定

4.5、继承

推荐工程目录

|--e3-parent:父工程,打包方式pom,管理jar包的版本号。项目中所有工程都应该继承父工程。

  |--e3-common:通用的工具类通用的pojo。打包方式jar

  |--e3-manager:服务层工程。聚合工程。Pom工程

    |--e3-manager-dao:打包方式jar

    |--e3-manager-pojo:打包方式jar

    |--e3-manager-interface:打包方式jar

    |--e3-manager-service:打包方式:jar

       |--e3-manager-web:表现层工程。打包方式war

继承是为了消除重复,可以把很多相同的配置提取出来。例如:grouptId,version等

4.5.1 创建父工程

4.5.2创建子工程

创建方式有两种:

一种是创建新工程为子工程,在创建时设置父工程的GAV。

一种是修改原有的工程为子工程,在子工程的pom.xml文件中手动添加父工程的GAV。

现有工程继承父工程只需要在pom文件中添加parent节点即可。

 4.5.3父工程统一依赖jar包

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

4.5.4父工程统一管理版本号

Maven使用dependencyManagement管理依赖的版本号。

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

父工程

子工程:

4.5.6父工程中版本号提取

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

子工程的jar包版本不受影响:

4.6、聚合

聚合一般是一个工程拆分成多个模块开发,每个模块是一个独立的工程,但是要是运行时必须把所有模块聚合到一起才是一个完整的工程,此时可以使用maven的聚合工程。

例如电商项目中,包括商品模块、订单模块、用户模块等。就可以对不同的模块单独创建工程,最终在打包时,将不同的模块聚合到一起。

例如同一个项目中的表现层、业务层、持久层,也可以分层创建不同的工程,最后打包运行时,再聚合到一起。

4.6.1 创建一个聚合工程

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

4.6.2 创建持久层工程

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

第二步:next

4.6.3 创建业务层工程

与持久层工程创建一样

4.6.4 创建表现层工程

点击next,进行下面的页面

在maven-controller中添加web.xml和index.jsp

聚合之后的maven-web工程的pom文件内容如下:

4.6.5 运行maven-web聚合工程

Tomcat7:run

注意:运行之前,需要将maven-parent工程安装到本地仓库中。

 

参考了:

https://blog.csdn.net/u012152619/article/details/51473404

https://blog.csdn.net/chaochunge/article/details/82146849

https://www.sohu.com/a/212704477_100012573(很全,推荐)

http://www.cnblogs.com/limn/p/9363416.html(创建步骤推荐,很好)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值