Maven 是 Java 平台上的自动化构建工具(Maven 本身也是使用 Java 编写的)。构建是指,以 Java 源文件、框架配置文件、HTML/CSS/JS/JSP、图片等资源为 原材料,去 生产 一个可以运行的工程项目的过程。
1. 构建的步骤(生命周期)
- 清理:讲之前编译得到的旧的
.class 字节码文件删除,为下一次编译做准备
- 编译:将 Java 源程序编译成 Class 字节码文件
- 打包:动态 Web 工程打成 War 包,Java 工程打成 Jar 包
- 安装:讲打包得到的文件 复制 到 仓库 中的特定位置
- 部署:将动态 Web 工程生成的 War 包 复制 到 Servlet 容器中的指定目录下,使其可以运行
2.Pom 文件
Pom文件是Maven 工程的核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。
2.1 pom文件中的坐标
使用下面三个参数GAV 在仓库中唯一定位一个 Maven 工程
G ——groupId :公司或组织域名倒序 + 项目名
A ——artifactId :模块名
V ——version :版本号
例如定位一个springboot的启动类
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
依赖信息中除了目标 jar 包的坐标还有一个scope设置,这是依赖的范围 依赖的范围有几个可选值,我们用得到的是:compile、test、provided
compile 范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包部署:参与
test 范围依赖
- 对主程序是否有效:无效
- 对测试程序是否有效:有效
- 是否参与打包部署:不参与
- 典型例子:
junit
provided 范围依赖
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包部署:不参与
- 典型例子:
servlet-api
总结如下:
例如:
如下依赖将不参与打包和主程序的使用。
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.0.RELEASE</version>
<scop>test</scop>
2.2 仓库
- 本地仓库:本地部署的仓库目录,为当前电脑所有 Maven 工程服务
- 远程仓库
- 私服:搭建在局域网中,为局域网范围内的所有 Maven 工程服务(公司自有服务器)
- 中央仓库:搭建在 Internet 上,为全世界所有 Maven 工程服务
- 中央仓库镜像:搭建在各大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求(如阿里云镜像,清华镜像,豆瓣)
?设置本地仓库
<settings>
<!-- 本地仓库的地址,存放jar包-->
<localRepository>${user.home}/.m2</localRepository>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
</settings>
设置私服
<repositories>
<repository>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>public</id>
<name>Public Repositories</name>
<url>http://192.168.0.96:8081/content/groups/public/</url>
</repository>
<repository>
<id>getui-nexus</id>
<url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</ur1>
</repository>
</repositories>
镜像换源
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2.3 Maven 的依赖、继承与聚合
1.依赖
1. 依赖排除,比如在springboot的依赖中通常会导入Logging的包,而你正好想用其他的logging依赖包则需要去除依赖。
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
2.统一管理依赖的版本号
这里对 Spring 各个jar包的依赖版本都是 4.0.0,如果需要统一升级为 4.1.1,手动修改不可靠。
?1)使用properties标签内使用自定义标签统一声明版本号
<properties>
<vectorx.spring.version>4.0.0.RELEASE</vectorx.spring.version>
</properties>
2)在需要统一版本的位置,使用自定义标签名引用声明的版本号??
<version>${vectorx.spring.version}</version>
3)其实properties标签配合自定义标签声明数据的配置,并不是只能用于声明依赖的版本号。凡是需要统一声明后再引用的场合都可以使用?
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
2.继承
举例说明:
现状
- HelloFriend 依赖的 Junit 版本:4.0
- MakeFriends 依赖的 Junit 版本:4.9
由于test 范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致
需求
解决思路
- 将
junit 依赖统一提取到“父”工程中,在子工程中声明junit 依赖时不指定版本,以父工程中统一设定的为准。同时也便于修改
1)创建一个 Maven 工程作为父工程(注意打包方式为pom)
<groupId>com.vectorx.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
2)在父工程中统一junit的依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
?3)?在子工程中声明对父工程的引用
<parent>
<groupId>com.vectorx.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.vectorx.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
4)删除子工程坐标中与父工程重复的内容
<parent>
<groupId>com.vectorx.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
5)删除子工程中junit 依赖的版本号部分
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
3.聚合
作用:一键安装各个模块工程
配置方式:在一个”总的聚合工程”中的POM文件中配置各个参与聚合的模块?
<!--配置聚合-->
<modules>
<!--指定各个子工程的相对路径-->
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>
|