Maven 实战

第一章 maven 简介

maven 是一个项目构建和项目管理工具。

maven 帮我们自动化构建项目,何为构建?编译、单元测试、生成文档、打包部署等就是构建。

maven 最大程度上消除了构建的重复。哈~消除重复,这个优点让我想到了 cleancode。

使用 maven,我们不再需要手动执行一个个测试方法进行测试,在构建的过程中就会进行自动测试。

maven 之前,十个项目可能有九种构建方式,有了 maven 之后,就只有一种方式,极大的避免了不必要的学习成本。

免费的中央仓库,只有定位了坐标,maven 就能帮我们自动下载,省去手工劳动。

强调测试驱动开发,测试先行。

其他流行的构建工具有 make 和 ant,但这里不作了解,需要的时候再回来看。

第二章 安装和配置

包括 windows 系统和 linux 系统下的安装两个部分。主要总结 windows 系统下的安装,linux/unix 用到的时候再说呗。

前提:maven 使用需要有 jdk,这点需要注意。

安装:

到官网上下载压缩包吧,甚至可以下载源码包。安装过程与 jdk、tomcat 的安装是类似的。

需要配置环境变量:

  • 配置 MAVEN_HOME
  • 把 bin 目录路径加入 path

安装完成之后就可以使用mvn -v查询版本信息。

安装目录以及各个目录的作用如下:

目录作用
bin包含了 maven 的运行脚本
boot只有一个 plexus-classworlds-2.5.2.jar,plexus-classworlds 是一个类加载器框架,maven 使用该框架来加载自己的类库
confsettings.xml,修改这个文件,就能全局定制 maven 的行为,我们一般将这个文件复制给用户,修改用户自己的 settings.xml
lib包含了所有 maven 运行时需要的 java 类库

在 settings.xml 可以设置 HTTP 代理。


eclipse 和 netbeans 如何安装 maven 插件,不过我看到 eclipse javaEE 版本已经集成了 maven 功能了。


【最佳实践】

  • 不用使用 IDE 内嵌的 maven,应该配置自己下载的 maven。
  • 配置用户自己的 settings.xml,不要使用全局的。

第三章 使用入门

  1. 编写 pom.xml 文件
  2. 编写主代码
  3. 编写测试代码
  4. 编译
  5. 执行测试
  6. 打包
  7. 安装到用户仓库

上述步骤可以通过 IDE 直接进行,也可以使用《maven 命令》进行。

打包之后就java -jar执行 jar 文件。此时提示“jar 中没有主清单属性”,解决办法就是在 pom.xml 中加入下面代码。

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-shade-plugin</artifactId>
			<version>2.4.1</version>
			<executions>
				<execution>
					<phase>package</phase>
					<goals>
						<goal>shade</goal>
					</goals>
					<configuration>
						<transformers>
							<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
								<mainClass>App</mainClass>
							</transformer>
						</transformers>
					</configuration>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

再次执行 jar 文件,就能看到 App.java 的 main 函数的执行效果。


是不是觉得手动简历目录结构太麻烦了?mvn archetype:generate命令可以自动生成项目骨架。

第四章 背景案例

略。

第五章 坐标与依赖

什么是坐标?

二维坐标系中,x 与 y 可以唯一确定一个点。而 maven 中,需要一系列元素唯一确定使用哪个开源包。这里的元素包括:

  • groupId:定义当前项目所隶属的实际项目。
  • artifactId:定义实际项目中的一个 maven 项目。
  • version:版本号。
  • packaging:打包方式,jar?war?默认的打包方式是 jar
  • classifier:用来帮助定义输出的附属组件,比如源码的 Java 文档。

前三项必须定义,我把它们叫做“坐标三要素”。

可以参考 spring 项目理解这些元素的含义。

哈哈,只要这些东西在 pom.xml 中定义,maven 可以帮助我们自动下载,再也不用到处查找 jar 包下载导入 lib 了。


上面说了坐标,下面说说依赖。

pom.xml 中可以定义一个或多个依赖。每个依赖都需要定义“坐标三要素”,根据坐标并找到对应的构件。

定义依赖除了需要坐标三要素还需要别的元素:

  • type:对应于坐标定义中的 packaging,默认不定义的话为 jar。
  • scope:依赖的范围,看了书中内容并做了测试还是不太理解,后续研究研究。
  • optional:标记依赖是否可选。
  • exclusions:用来排除传递依赖,传递依赖中的某个依赖不想要了,而是因为某种需要显式声明了,使用这个。

【依赖分析】

传统的项目,我们引入了 spring,但是 spring 又依赖别的开源类库 A,而 A 又依赖开源类库 B,这样就形成传递依赖。

maven 项目,通常情况下,只需要关心直接依赖是什么就好了,不用考虑这些直接依赖会引入什么依赖,因为这些都是自动的。

但是可能出现当前项目存在多个“相同”的依赖,此时,路径最近者优先,在路径长度相等的情况下,查看 pom 文件中的声明顺序,靠前声明的优先。


【最佳实践】

举个例子,spring 项目的多个组件引入,版本号一样,此时最好是一改俱改。因此下面的方式是合适的,将重复元素提取到 properties 中。

在这里插入图片描述

通过下面几个命令可以分析依赖。

mvn dependency:list
mvn dependency:tree
mvn dependency:analyze

第六章 仓库

包括本地仓库和远程仓库,当 maven 根据坐标寻找构件的时候,如果本地存在此构件就直接使用,否则就需要从远程仓库下载到本地。找不到构件将会报错。

中央仓库是 maven 默认自带的远程仓库。

私服是一种特殊的远程仓库,局域网内自建仓库,类似于缓存的作用,私服可以从多个远程仓库中下载构件,特殊的构件也可以自己上传,项目只和私服(缓存)打交道。

私服的优点如下:

  • 节省网络带宽。
  • 加速构建,不停地连接外网请求远程仓库是非常耗时的。
  • 部署第三方构件,自己上传咯。
  • 增强稳定性,外网的远程仓库稳定性不可控。

建立私服的软件 Nexus???仓库搜索服务 Nexus。

有时候默认的仓库无法满足我们的需求,可能我们需要的构件在另一个远程仓库,可以在 POM 配置该仓库。

大部分远程仓库无需认证就可以访问,但为了安全有些访问有些仓库需要提供认证信息,认证信息配置在 settings.xml 中。

可以将生成的构件部署到私服(远程仓库),如下图:

在这里插入图片描述

id 是远程仓库的唯一标识,name 是为了方便阅读的,url 是远程仓库的地址。

使用mvn clean deploy,maven 就会将项目输出的构件部署到配置的远程仓库。

可以在 settings.xml 中为远程仓库配置镜像,使用镜像来代替该仓库,当镜像仓库不可用时,将无法下载构件。

第七章 生命周期与插件

maven 生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。

maven 的生命周期本身是抽象的,实际的任务交给插件来做,类似模板方法模式。

在这里插入图片描述

maven 包括三套生命周期,clean、default、site,相互独立互不影响。

插件与生命周期是绑定的,maven 有内置绑定,用户也可以自定义绑定。

可在 POM 中进行插件配置。

第八章 聚合与继承

如果我开发了 A 项目和 B 项目,现在需要一次构建两个项目,就要用到聚合了。

继承,类似 java 的继承,有了继承,项目的依赖和插件配置也得以大幅优化。


约定优于配置,这是 maven 的一大设计理念。

为什么要使用约定而不自己灵活配置呢?

约定可以大量减少配置。比如 Ant 构建项目需要配置源码目录、编译目标目录等。maven 不需要上述配置,因为这些在 maven 中有约定的默认配置。而且 maven 允许你自定义这些配置。

约定通过“超级 POM”实现。

反应堆:对于单模块项目来讲,反应堆就是项目本身,对于多模块项目来讲,反应堆包含了各个模块的之间的继承和依赖关系,从而能够计算出合理的模块构建顺序。如果出现了循环依赖的情况,maven 就会报错。

第九章 使用 Nexus 创建私服

略。

第十章 使用 maven 进行测试

略。

第十一章 持续集成

略。

第十二章 使用 maven 构建 web 应用

略。

第十三章 版本管理

在这里插入图片描述

版本号定义约定:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第十四章 灵活的构建

通过 Maven 属性、资源过滤、Profile 来进行灵活的构建,实质就是自动化地在不同的条件下使用不同的配置进行不同地构建。

第十五章 生成项目站点(略)

第十六章 m2eclipse(略)

第十七章 编写 Maven 插件(略)

第十八章 Archetype

介绍常用的 Archetype,比如:

  • maven-archetype-quickstart:最常用的 Archetype,基本上是一个 helloworld。
  • maven-archetype-webapp:这是一个最简单的 war 模板,当需要快速创建一个 web 应用的时候使用它。
  • 等等。

如果有非常多的项目使用同样的框架和项目结构,苦于一个个项目创建重复的配置及同样的目录结构,此时可以创建自己的 Archetype 来减少工作量。

封面

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JavaRecorder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值