参考资料
1 什么是 maven ?
Maven 是一个构建和管理任何 Java 项目的工具。
在 Maven 出现之前基本上用的都是 Ant 构建项目。
Maven 的目标是:
- 简化构建过程
- 提供一个统一的构建系统
- 提供优质的项目信息
- 促进更好的开发体验
2 安装配置 Maven
2.1 环境要求
- JDK : maven 3.3+ 要求 JDK 1.7(及以上); 3.2 要求 JDK1.6 ;3.1 要求 JDK 1.5
- 内存:无
- 磁盘:本身安装需要 10M,本次 Maven 仓库建议至少 500M+
- 操作系统:无。
2.2 下载地址
下载页面:
下载地址:
- https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
- https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.zip
- https://dlcdn.apache.org/maven/maven-3/3.8.6/source/apache-maven-3.8.6-src.tar.gz
- https://dlcdn.apache.org/maven/maven-3/3.8.6/source/apache-maven-3.8.6-src.zip
历史下载页面:
历史下载地址:
2.3 windows 系统
- 安装 JDK 并配置好环境变量(JAVA_HOME)。
# 打开 CMD 窗口,验证 JDK 安装情况
## 1. 查看 JAVA_HOME 变量
echo %JAVA_HOME%
## 2. 查看 PATH 变量
echo %PATH%
## 3. 查看 Java 版本
java -version
- 下载 apache-maven-3.8.6-bin.zip
- 解压 apache-maven-3.8.6-bin.zip 到本地磁盘某文件夹下,这里我存放到 D:\software\ 下
- 将 D:\software\apache-maven-3.8.6\bin 配置到系统变量 PATH 中(注意:要使用“;”与前面的值分隔)。
- 验证 Maven 安装情况
# 打开 CMD 窗口,验证 Maven 安装情况
## 1. 查看 PATH 变量
echo %PATH%
## 2. 查看 Maven 版本
mvn -v
控制台输出:
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: D:\software\apache-maven-3.8.6
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: G:\work\software\jdk1.8_64\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
至此 Maven 安装成功。
2.4 Linux、Mac 系统
- 安装 JDK
- 下载 apache-maven-3.8.6-bin.tar.gz 到服务器 /opt 下
- 解压 apache-maven-3.8.6-bin.tar.gz
tar -xvf apache-maven-3.8.6-bin.tar.gz
- 将 /opt/apache-maven-3.8.6/bin 添加到 PATH 下:
export PATH=$PATH:/opt/apache-maven-3.8.6/bin
- 查看 Maven 版本
mvn -v
至此 Maven 安装成功。
2.5 配置 Maven
- Maven 的配置文件位置:{Maven 安装目录}/conf/settings.xml
比如,本地安装目录为 D:\software\apache-maven-3.8.6 那么配置文件路径在 D:\software\apache-maven-3.8.6\conf\settings.xml
2.5.1 配置本地 Maven 仓库保存路径
打开 settings.xml 文件,在 <settings>
标签下添加:
<!-- 保存从中央仓库下载的 jar 包到 D:/software/repository -->
<localRepository>D:/software/repository</localRepository>
2.5.2 配置国内镜像仓库
打开 settings.xml 文件,在 <settings><mirrors>
标签下添加:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>alibaba maven repository</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
3 Maven 插件
Maven 本质是一个插件驱动框架,所有的工作都是由插件来完成。
分为两种类型插件:
- 构建插件:POM.xml 的
<build>
标签中配置。 - 报告插件:生成站点时使用,在POM.xml 的
<reporting/>
标签中配置。
3.1 核心插件
核心插件:对应默认的 clean package 等, 每个插件会有多个 goal
3.2 报告插件
Maven 构建生命周期
Maven 内置的构建生命周期
默认内置了 3 钟构建声明周期:
- default 生命周期:处理项目部署
- clean 生命周期:处理项目清理
- site 生命周期:解决项目站点的生成
构建生命周期是由不同的阶段组成的。
更详细的生命周期介绍:https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference
default 生命周期
default 生命周期由以下阶段组成:
- validate :验证项目的正确性和依赖信息的可用性
- compile :编译源码
- test : 使用合适的单元测试框架测试编译后的代码
- package :将编译后的代码打包成 JAR或war等.
- verify :运行结果校验保证质量
- install :将package 打出来的包安装到本地 Maven 仓库
- deploy :将 jar 包部署到远程仓库供其他人使用
使用命令行调用这些阶段,比如 mvn clean
每个阶段又对应1个或多个插件的任务。
mvn clean dependency:copy-dependencies package
# 可以执行多个阶段或插件任务,并且按先后顺序执行。
POM
POM(项目对象模型)是一个 xml 格式文件,包含了项目信息和 Maven 构建项目使用的详细配置。
Super POM
所有的模块都继承自一个 super-pom:
<project>
<modelVersion>4.0.0</modelVersion>
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
<build>
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
<pluginManagement>
<!-- NOTE: These plugins will be removed from future versions of the super POM -->
<!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<reporting>
<outputDirectory>${project.build.directory}/site</outputDirectory>
</reporting>
<profiles>
<!-- NOTE: The release profile will be removed from future versions of the super POM -->
<profile>
<id>release-profile</id>
<activation>
<property>
<name>performRelease</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<inherited>true</inherited>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
最小配置 pom
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>
项目继承
pom.xml 中可以合并的元素:
- dependencies
- developers and contributors
- plugin lists (including reports)
- plugin executions with matching ids
- plugin configuration
- resources
pom.xml 中<parent>
标签可配置父 pom 。
例子1
父工程与模块的目录结构:
.
|-- my-module
| `-- pom.xml
`-- pom.xml
pom 配置:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
例子2
父工程与模块的目录结构:
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
pom 文件配置:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<!-- 父 pom 的相对位置 -->
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>
项目聚集
特点:
- 父 Pom 的打包格式必须是 pom
- 父 pom 添加
<module>
标签配置子模块
例子1
目录结构:
.
|-- my-module
| `-- pom.xml
`-- pom.xml
pom 配置:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>my-module</module>
</modules>
</project>
例子2
目录结构:
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
pom 配置:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>../my-module</module>
</modules>
</project>
项目继承 VS 项目聚集
一般来说,项目继承用于不同的 maven 项目使用了相同的配置;项目聚集适用于一组项目需要共同构建和处理。
当然也可以同时使用项目继承和项目聚集,例如:
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>../my-module</module>
</modules>
</project>
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>
POM 中的变量
- 项目模型变量
pom 文件中只要是单个值的标签都可作为变量用于引用,例如 $
- 特殊的变量
- project.basedir
- project.baseUri
- maven.build.timestamp
- properties
在 POM 文件中,使用<properties>
标签配置自定义属性,然后通过${}方式使用自定义属性,例如:
<project>
...
<properties>
<mavenVersion>3.0</mavenVersion>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>${mavenVersion}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>${mavenVersion}</version>
</dependency>
</dependencies>
...
</project>
配置文件(Profile)
配置文件的类型
- 项目配置:pom.xml 配置
- 用户配置:(%USER_HOME%/.m2/settings.xml)
- 全局配置:(${maven.home}/conf/settings.xml)
- 配置文件描述符:profiles.xml (Maven 3.0 已经不支持)
配置的触发方式
- 命令行
- setting.xml
- 环境变量
- 操作系统设置
- 现有或丢失的文件
激活配置
方式一: 通过命令行激活配置
使用命令行参数
-P
后面紧跟配置ID,如果有多个ID则用逗号拼接
# ? 表示 profile-3 是可选配置
mvn groupId:artifactId:goal -P profile-1,profile-2,?profile-3
方式二:通过 setting.xml 的 <activeProfiles>
标签
<settings>
...
<activeProfiles>
<activeProfile>profile-1</activeProfile>
</activeProfiles>
...
</settings>
使配置失效
在配置ID加 "!"或者"-"可让对应的配置失效
mvn groupId:artifactId:goal -P !profile-1,!profile-2,!?profile-3
或
mvn groupId:artifactId:goal -P -profile-1,-profile-2,-?profile-3
配置文件顺序
按声明顺序,越在后面声明的配置优先级越高。
<project>
...
<repositories>
<repository>
<id>global-repo</id>
...
</repository>
</repositories>
...
<profiles>
<profile>
<id>profile-1</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>profile-1-repo</id>
...
</repository>
</repositories>
</profile>
<profile>
<id>profile-2</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>profile-2-repo</id>
...
</repository>
</repositories>
</profile>
...
</profiles>
...
</project>
顺序:profile-2-repo, profile-1-repo, global-repo
如何知道正在生效的配置
以下命令可以知道正在生效的配置是什么:
mvn help:active-profiles
仓库
Maven 仓库分为本地仓库和远程仓库,如果本地没有依赖的包,那么就会从远程仓库下载。
Maven 项目的目录层级
- src/main/java Application/Library sources
- src/main/resources Application/Library resources
- src/main/filters Resource filter files
- src/main/webapp Web application sources
- src/test/java Test sources
- src/test/resources Test resources
- src/test/filters Test resource filter files
- src/it Integration Tests (primarily for plugins)
- src/assembly Assembly descriptors
- src/site Site
- LICENSE.txt Project's license
- NOTICE.txt Notices and attributions required by libraries that the project depends on
- README.txt
Maven 依赖层级
依赖范围
- compile 默认依赖范围,编译依赖项可在项目的所有类路径中使用。
- provided 很像 compile,但是你期望在运行时 JDK 或 容器提供这些依赖,比如 Servlet API 等。不传递。
- runtime 表明编译时不要求此依赖,但是在执行时必须有。
- test 表明依赖仅在测试编译和执行阶段使用。
- system 期望必须明确提供 jar,框架总是可用,不需要从仓库查找。
- import 仅支持依赖
<dependencyManagement>
标签中的 pom。
依赖管理
依赖管理是集中依赖信息的机制
<dependencyManagement>
作用:
- 配置通用依赖
- 声明公共依赖的版本,子模块依赖时可继承父 POM的
<dependencyManagement>
导入这个 BOM POM 即可。
引用的依赖版本
导入依赖
<dependencyManagement>
引入的依赖类型是 pom 类型且范围是 import,那么依赖的 pom 所有的依赖管理会合并到当前 pom 的<dependencyManagement>
中,除了<dependencyManagement>
声明的具体版本的依赖。
如果依赖了多个 pom 且范围都是 import,这些 pom 存在重复依赖,那么谁声明在前谁的优先级就越高。
BOM(材料清单)
根是 BOM pom,它定义了库中所有将要创建的artifacts的版本。如果其他项目想使用此库,那么只要在其 pom 的 <dependencyManagement>
导入这个 BOM POM 即可。
BOM 项目使用:
BOM pom // 管理了多个项目的版本形成一个库
|
|---parent project pom // 继承 BOM
|
|----- subproject pom // 继承 parent project pom,版本号使用 BOM定义的项目版本号
当其他项目使用 BOM 下某个子项目时,可直接导入 BOM ,然后声明自己使用的依赖。
系统依赖
使用场景:当 maven 仓库没有维护的 jar 包时,可以使用
<systemPath>
指定jar包位置
<project>
...
<dependencies>
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
</dependencies>
...
</project>
可选依赖和排除依赖
可选依赖
-
什么是可选依赖?
答:当一个项目无法拆分为子模块时,可以使用可选依赖;当某些依赖仅仅是实现特定的功能且暂时不需要使用这些功能时,可以将这些依赖设置为可选依赖;如果其他项目想使用这些功能,则必须声明依赖(非可选)。 -
为什么使用可选依赖?
答:可以节省空间和内存,
<dependency>
标签下使用<optional>
声明此依赖时可选依赖
<project>
...
<dependencies>
<!-- declare the dependency to be set as optional -->
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
<scope>compile</scope>
<optional>true</optional> <!-- value will be true or false only -->
</dependency>
</dependencies>
</project>
排除依赖
由于 Maven 是以传递方式解析依赖,所以你的项目中可能会依赖不必要的jar
<dependency>
标签下使用<exclusions>
声明排除的依赖
其他
settings.xml 详细说明
官网:https://maven.apache.org/ref/3.8.6/maven-settings/settings.html
pom.xml 详细说明
本文来自博客园,作者:不安分的黑娃,转载请注明原文链接:https://www.cnblogs.com/lihw-study/p/16948599.html