一、介绍
随着组件的不断增加,项目越来越大,jar包的规模也越来越多。一个项目中有上百个jar包非常正常。框架中使用的jar包,不仅数量庞大,而且彼此之间存在错综复杂的依赖关系。依赖关系的复杂程度,已经上升到了完全不能靠人力手动解决的程度。如果要开发者自己一个个引入,那需要耗费很多时间,还可能会因为部分jar包遗漏或者版本不对,导致项目运行出错。此时Maven的作用就体现出来了。
(1)依赖管理:主要作用是用于添加jar包,可判断依赖关系自动导入相关jar包,以及获取第三方jar包;
(2)项目构建:可作为构建管理工具,生成可在服务器上运行的项目,并且可将项目拆分为多个工程模块。
Maven的工作机制如图:
Maven的核心程序在官网就有提供,只需要到官网下载,然后直接解压即可。
主要有三个配置是需要刚下载Maven进行配置的。一个是指定本地仓库:
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>D:\maven-repository</localRepository>
另一个是要配置阿里云提供的镜像仓库。因为原本的配置是国外的网站,会导致下载和配置各种包速度很慢,需要配置国内的镜像源。
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
最后还需要配置Maven工程的基础JDK版本
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
注意:如果使用IDEA进行开发,除了阿里云镜像仓库之外,其余两个配置是可以在IDEA中进行配置,省略在配置文件中进行撰写。
三、Maven构建过程的主要环节
1、清理:
- 作用:删除之前的编译结果,为重新编译做准备
- 效果:删除target目录
2、编译:
- 作用:将 Java 源程序编译为字节码文件
- 结果:主体程序编译结果存放的目录:target/classes;测试程序编译结果存放的目录:target/test-classes
3、测试:
- 作用:针对项目中的关键点,使用提前准备好的测试程序进行测试,确保项目在迭代开发过程中关键点的正确性
- 测试的报告存放的目录:target/surefire-reports
4、报告:
- 作用:在每一次测试后以标准的格式记录和展示测试结果
5、打包:
- 作用:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。
- 存放的目录:target
6、安装:
- 作用:在 Maven 环境下特指将打包的结果——jar包或war包,和pom文件一起存入到本地仓库中
- 注意:jar 包在 Maven 仓库中的路径是根据它的坐标生成的。
7、部署:
- 作用:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行
构建过程的主要环节构成了Maven的生命周期:Clean、Slte、Default。这三个生命周期是彼此独立的。在任何一个生命周期内部,执行任何一个具体环节的操作,都是从本周期最初的位置开始执行,直到指定的地方。
四、其他内容
1、Maven核心概念:POM
POM:Project Object Model,即项目对象模型。其采用模型化思想,将工程抽象为一个模型,再用程序中的对象来描述这个模型。对应核心配置文件:pom.xml。
2、dependencies配置
scope:
- 标签的可选值:compile/test/provided/system/runtime/import
- (1)每种标签代表依赖的范围,主要用于表示是否能在main目录、test目录、开发过程、部署到服务器时生效;
- (2)依赖具有传递性,即在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于B 依赖 C 时使用的依赖范围,例如B依赖C时是compile的,则可以传递的。
- 绝大部分都是compile范围,全部时刻都有效
exclusions:
- 配置依赖的排出,其中使用exclusion指定要排除的坐标,防止依赖冲突
3、继承
工程之间可以继承,可以在父工程中统一管理项目中的依赖信息,以此对大型项目的project进行module模块拆分。实际做法为:
(1)首先需要在父工程指定packaging为pom,然后modules中指定聚合配置
(2)子工程中需要指定父工程的坐标,可以在父工程中配置统一的依赖管理,子工程中再指定就可省略版本号;也可在父工程的properties中中声明自定义属性,之后使用${属性名}调用
4、结合IDEA的具体操作
每次创建 Project 后都需要设置 Maven 家目录位置,否则 IDEA 将使用内置的 Maven 核心程序(不稳定)并使用默认的本地仓库位置。这样一来,我们在命令行操作过程中已下载好的 jar 包就白下载了,默认的本地仓库通常在 C 盘,还影响系统运行。
配置之后,IDEA 会根据我们在这里指定的 Maven 家目录自动识别到我们在 settings.xml 配置文件中指定的本地仓库。