软件配置管理之Maven项目管理工具

一、什么是Maven?

Apache开源组织奉献的一个开源项目。 本质是一个跨平台的项目管理工具,对项目信息和依赖信息进行管理,将项目开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需做一些简单的配置,就可以批量完成项目的构建、报告和文档的生成工作。

二、Maven的作用

  • 统一管理好所有的依赖包(即jar包),不需要程序员再去寻找。
  • 自动解决多个jar包的重复和冲突问题。
  • 可以统一每个项目的构建过程(编译、测试、打包、部署等所有过程),实现不同项目的兼容性管理。

(1)项目构建(即管理编译、测试、打包部署等过程)

(2)依赖管理(即统一管理jar包)

三、Maven的安装

四、Maven的常用命令

mvn -v (-version)# 查看Maven版本信息
mvn archetype:generate# 在当前路径下构建Maven项目(基于Maven的Java项目)
mvn clean          # 清洗项目——清理其他操作产生的一些不是很重要的文件,例如compile后的target文件夹
mvn compile# 编译项目——将代码编译为二进制,生成target文件夹
mvn test  # 测试项目
mvn package  # 打包项目
mvn install          # 安装项目——将maven项目压缩为一个jar包

mvn site

# 生成站点——将项目路径网址有效化,能够通过项目路径打开一个网页

mvn dir#查看maven项目目录
mvn tree /f#查看项目工程目录

五、Maven的生命周期

前言:软件开发人员在开发软件时经常会对软件项目进行清理、编写、编译、测试、打包以及安装和部署的操作。

因此在Maven中,便将以上一系列的操作抽象出来成为一个适用于所有项目的构建生命周期,并将它们统一规范。具体步骤包括清理、初始化、编译、测试、打包、集成测试、验证、部署和生成站点。几乎所有的项目的管理构建过程都可以对应到这个生命周期上来。


ps:这里需要注意的是maven只是规定了生命周期的各个阶段和步骤,具体事情,由集成到Maven中的插件完成。

Maven有三套独立的生命周期:

(1)clean生命周期:目的是清理项目
(2)default生命周期:目的是构建项目
(3)site生命周期:目的是建立项目站点

每套生命周期又包含了多个阶段,且这些阶段在执行的时候是有固定执行顺序的。后面的阶段一定要等前面的阶段顺利执行完成后才能被执行。如clean生命周期:

里面的pre-clean,clean,post-clean便是clean生命周期的三个阶段,依次对应着不同的项目情况。其他生命周期更详细的阶段介绍可以上Maven官网去查看:Maven – Introduction to the Build Lifecycle

六、Maven的插件

1.插件与目标:

(1)在maven中用于执行特定构建任务的工具。 它们扩展了 Maven 的核心功能,允许开发者进行如编译、测试、打包、部署等多种操作。因为Maven只是对项目的构建过程进行统一的抽象定义和管理。至于每个阶段由谁做,是让对应的插件去完成。一个插件可以实现Maven项目生命周期多个阶段的任务。

(2)我们将插件的每个功能叫做目标

ps:比如maven-compiler-plugin可以实现“compile”和“testCompile”两个功能。

(3)因此我们可以将插件与生命周期进行绑定,实现在哪个阶段,执行哪个插件,达到哪个目标。插件同生命周期阶段绑定后,可以将插件的功能集成到Maven生命周期的相关阶段中去,让Maven构建工程时可以自动调用插件完成制定的任务。

2.插件的调用:

命令行执行Maven插件的语法:

mvn <插件名称|前缀>:<目标>[-D参数名=参数值...]

mvn install            [此处的install是指阶段]

mvn install:install  [此处第一个install是指插件——第二个install是指目标]

3.插件的参数配置

(1)命令行配置参数:

                在Maven命令中,使用[-D参数名=参数值...]的方式配置目标参数

                如mvn install -Dmaven.test.skip=true命令,可以实现跳过不执行test案例的配置。

(2)pom配置参数:

                使用<configuration>

4.如何将Maven生命周期与插件进行绑定?

(1)内置绑定

Maven自动为生命周期的主要阶段绑定了很多插件的目标,执行某个阶段时,插件目标会自动调用。 用户可以更方便的使用Maven,减少配置次数甚至不用配置。 如maven-clean-plugin中有个clean目标,默认绑定在clean生命周期的clean阶段。 

(2)自定义绑定(指定在某个阶段绑定某个插件的某个目标)

指定在某个阶段绑定某个插件的某个目标。如maven-site-plugin有一个目标为“site”,主要是用来生成site站点的。

在命令窗口执行命令mvn help:describe -Dplugin=org.apache.maven.plugins:maven-site-plugin:3.12.1 -Ddetail  可查看插件详细信息,同时site目标的默认绑定阶段为“site”。

举例:将site插件绑定到“install”阶段

步骤一:打开maven的pom.xml文件,将maven-site-plugin的“site”目标绑定到“install”阶段

步骤二:打开命令窗口运行“install”阶段

ps:如果在一个阶段上绑定了多个目标,每个目标都会执行,且按插件声明的顺序执行。

ps:在线获取插件信息:http://mvnrepository.com/

七、Maven的坐标

1.定义:

简单来说就是对maven文件的唯一定位查找。Maven仓库管理构件,构件的坐标唯一定位查找

2.一个完整的坐标信息:

groupId定义当前Maven项目从属的实际项目(必需)
artifactId定义实际项目中的一个Maven项目,推荐命名方式:实际项目名称-模块名称(如spring-core等)(必需)
version定义Maven当前所处的版本(必需)
packaging定义Maven项目的打包方式,jar、war、pom等,不指定时默认为jar(默认为jar)
classifier定义构建输出的附属构建(默认生成,不能直接定义)

八、Maven的仓库

1.什么是仓库?

Maven统一存储了所有Maven项目用到的构件,这些构件都是共享的。当某个Maven项目要使用某些构件的时候,就直接通过构件的坐标引用共享的构件,不需要复制到每个Maven工程的独立物理目录中去。这个统一的位置就是仓库。

2.仓库的管理方式

Maven构件都是以文件的形式存在的,Maven仓库其实就是使用固定规则的目录结构,把构件保存在一个固定的存储位置,需要的时候可以按照规则找到这些具体的构件。

如有个构建:groupId=cn.com.mvnbook.demo,artifactId=SSMDemo,version=0.0.1-SNAPSHOT,packaging=jar,它对应的路径将按如下步骤,逐个生成:

(1)生成groupId对应的第一部分路径:将groupId中的点分隔符转换成路径分隔符,生成cn/com/mvnbook/demo
(2)生成artifactId对应的第二部分路径:在第一部分路径基础上,加一层跟artifactId名称一样的目录,即生成cn/com/mvnbook/demo/SSMDemo
(3)生成version对应的第三部分路径:

在前面的基础上追加同version同名的目录cn/com/mvnbook/demo/SSMDemo/0.0.1-SNAPSHOT

(4)前面三步生成了目录,接下来按照规则生成构件的文件名:首先按照<artifactId>-<version>组成第一部分,如SSMDemo-0.0.1-SNAPSHOT
(5)如果有classifier的话就在后面用连接符“-”连接classifier名字,如果没有,就直接在后方加上packaging的后缀即可最后生成的目录和文件名是cn/com/mvnbook/demo/SSMDemo/0.0.1-SNAPSHOT/SSMDemo-0.0.1-SNAPSHOT.jar

3.仓库的种类

(1)本地仓库:

    构件保存到本地仓库的两种方式

  • 从远程仓库下载
  • 本地项目打包后安装

(2)远程仓库:

     比如中央仓库(默认的远程仓库)、私服、其他公共仓库【镜像】

(1)镜像:如果仓库A能够提供仓库B存储的所有服务,那么就把A叫作B的镜像

九、Maven的依赖

1.什么是依赖?

简单来说就是jar包。

开发项目所需要的插件,直接指定构件坐标,告诉Maven将坐标对应的构件从仓库中找出来,集成到新项目中即可。这时候引入的构件,就是新项目的依赖

2.依赖的范围:

<scope>?</scope> ——用于控制编译classpath、测试classpath、运行classpath

compile   编译依赖范围
 
test 测试依赖范围
provided  已提供依赖范围
runtime运行时依赖范围
system     系统依赖范围

3.依赖的配置:

在pom.xml中<dependencies>中配置

4.传递依赖

简单来说就是直接依赖带来的间接依赖

5.依赖的调解原则

当多个直接依赖都带来了同一个间接依赖,而且是不同版本的间接依赖时,就会引起重复依赖,甚至包冲突的问题。

(1)第一原则:路径优先原则(以短路径长度为准)

例如:

                项目A--->B--->C--->D2.0          

                项目A--->E--->D1.0              

应选择D1.0

(2)第二原则:声明优先原则(相同路径长度时,以pom中声明顺序先者为准,即第一声明者优先)

例如:

                项目A--->B--->C--->D2.0          

                项目A--->F--->C--->D1.0            

                应选择 D2.0?D1.0?都有可能!

哪个依赖在pom.xml中先声明,就引入先声明的依赖。若先声明了B,后声明了F,则为D的2.0版本,否则相反

6.排除依赖

当前项目pom中配置 exclusion标签 手动去除依赖

十、Maven的继承和聚合

聚合是为了方便快速构建项目,而继承是为了消除重复配置

1.继承

继承是站在子工程的角度上,看子工程继承了哪个父工程的配置

Maven借鉴了面向对象的思想,支持继承。 将多个项目要用的配置,单独用一个pom类型的工程定义好,其他有重复使用这些配置的Maven项目就可以在继承公共pom项目的基础上,再扩展自己个性化的信息。分为父工程和子工程,父工程packaging类型为pom,子工程packaging类型为jar或者war等 在各个子工程中使用<parent></parent>标记

2.聚合

聚合是在站在总工程的角度上,看总工程聚合了哪些子模块

聚合机制能用一个独立的Maven工程(里面是没有代码,只有pom.xml,packaging类型为pom)将相关的Module模块合并起来。这样每个构建过程(命令)只要在独立的pom Maven工程上进行,Maven就会自动将包含的每个模块工程同步构建。通过modules和module将相关的独立Maven模块工程配置在一起,完成Maven模块的聚合。

3.两者的相同点:

打包方式都是pom,除了pom文件之外没有其他实际的内容。

4.两者的不同点:

聚合是聚合模块通过module引用被聚合模块,而继承是子模块通过parent引用父模块。

十一、如何基于IDEA使用Maven创建Java项目?

1.添加路径:

2.开始创建项目:

(1)选择相应的archetype

(2)填入项目名称以及其他信息

(3)点击finish完成创建

(4)成功!之后再去执行lifecycle的相应命令操作即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值