文章目录
第一章 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 使用该框架来加载自己的类库 |
conf | settings.xml,修改这个文件,就能全局定制 maven 的行为,我们一般将这个文件复制给用户,修改用户自己的 settings.xml |
lib | 包含了所有 maven 运行时需要的 java 类库 |
在 settings.xml 可以设置 HTTP 代理。
eclipse 和 netbeans 如何安装 maven 插件,不过我看到 eclipse javaEE 版本已经集成了 maven 功能了。
【最佳实践】
- 不用使用 IDE 内嵌的 maven,应该配置自己下载的 maven。
- 配置用户自己的 settings.xml,不要使用全局的。
第三章 使用入门
- 编写 pom.xml 文件
- 编写主代码
- 编写测试代码
- 编译
- 执行测试
- 打包
- 安装到用户仓库
上述步骤可以通过 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 来减少工作量。