随着开发的项目越来越庞大,再引入各类框架,项目中所需要的jar包越来越多,所以我们需要项目构建工具Maven来协助我们快速构建一个企业级的项目并帮助我们管理大量的依赖
Maven自动构建项目的流程:
- 清理:删除以前的编译结果,为重新编译做好准备。
- 编译:将 Java 源程序编译为字节码文件。
- 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
- 报告:在每一次测试后以标准的格式记录和展示测试结果。
- 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web 工程对应 war 包。
- 安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
- 部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。
Maven中的pom.xml文件:
POM Project Object Model:项目对象模型。该文件中配置了当前项目模块的名称与版本号,指定了项目需要的依赖,也就是jar包,也可以指定需要的插件。pom.xml是Maven项目的核心配置。
pom.xml中的坐标、依赖概念:
坐标由如下三个向量组成,也可称为gav,坐标可确定一个唯一的maven工程。
- groupid:公司或组织的域名倒序+当前项目名称
- artifactId:当前项目的模块名称
- version:当前模块的版本
例如以下,确定的是cn/hp/common/1.0-SNAPSHOT/common.1.0-SNAPSHOT.jar
这个maven项目模块打成的jar包:
<groupId>cn.hp</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
而依赖例如,配置了依赖,Maven会主动去仓库寻找或下载对应jar:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
Maven中的仓库概念
仓库又分为
- 本地仓库:为当前本机电脑上的所有 Maven 工程服务,默认为本机家目录下的.m文件夹下的repository文件夹。
- 远程仓库:
私服:架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务。
中央仓库:架设在 Internet 上,为全世界所有 Maven 工程服务。
中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的
响应用户请求,可以在下载的maven资源中的conf文件夹中的setting.xml中加入阿里云镜像,下载jar更快。
仓库中的文件
3. Maven 的插件
4. 我们自己开发的项目的模块
5. 第三方框架或工具的 jar 包
依赖的范围
依赖的范围有compile、test、provided ,在依赖中使用<scope>
来指定,例如:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.8.RELEASE</version>
<scope>compile</scope>
</dependency>
- compile 范围的依赖在maven项目下的main工程与test工程都可以使用,项目打包时依赖会一并打包,例如spring核心包
- test 范围的依赖只允许test工程使用,项目打包时不参与打包,例如junit包
- provided 范围的依赖允许main工程与test工程使用,项目打包时不参与打包,例如servlet.api包
compile | test | provided | |
---|---|---|---|
主程序 | √ | × | √ |
测试程序 | √ | √ | √ |
参与部署 | √ | × | × |
依赖的排除
如果一个maven工程中出现同样的依赖,可以选择性排除一个,例如:
<dependency>
<groupId>cn.hp</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
maven工程统一管理依赖版本号
在pom.xml中使用<propertie>
标签来声明版本号,例如:
<properties>
<spring.version>5.0.8.RELEASE</spring.version>
</properties>
在依赖中使用${spring.version}
赋予版本,例如:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<scope>compile</scope>
</dependency>
依赖的原则
- 就近原则,一个工程可能依赖的jar版本不同,那么选择依赖关系路径与自己最近的jar
- 如果路径相同,则按pom.xml中声明依赖的顺序,选择最先声明的
依赖的继承
创建父工程,父工程中定义了大量子工程需要的依赖。在子工程中引用父工程,例如:
<parent>
<!-- 父工程坐标 -->
<groupId>cn.hp</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>从当前目录到父项目的 pom.xml 文件的相对路径</relativePath>
</parent>
父工程中依赖用<dependencyManagement>
包起来,只是声明该依赖,不会自动下载对应jar,只有子工程继承了该依赖才会触发下载并引入:
<dependencyManagement>
<dependencies>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.8.RELEASE</version>
<scope>compile</scope>
</dependencies>
</dependencyManagement>
在子项目中重新指定需要的依赖,可以删除范围和版本号
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
聚合
将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行 clean 操作。而使用了聚合之后就可以批量进行 Maven 工程的安装、清理工作。 在父工程中使用 modules/module
标签配置聚合,例如:
<modules>
<module>common</module>
<module>item</module>
</modules>