本文章用于在学习maven过程中,记录知识点使用。
参考:maven安装
建议:不要使用IDE内嵌的maven插件。通过命令行执行maven操作。
maven使用坐标规则为任何构建进行唯一标识。坐标是依赖的基础。
maven通过groupId、artifactId、version、packaging、classifier元素定义坐标。
<groupId>cn.com.chujiegroupId>
<artifactId>spring-boot-testartifactId>
<version>1.0version>
<packaging>warpackaging>
元素 | 说明 | 是否必填 |
---|---|---|
groupId | 定义当前Maven项目隶属的实际项目 | 必填 |
artifactId | 该元素定义当前实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀 | 必填 |
version | 该元素定义了使用构件的版本 | 必填 |
packaging | 定义Maven项目打包的方式,常用jar和war。 | 非必填,默认jar |
classifier | 该元素用来帮助定义构建输出的一些附件。 | 不可填,不能直接定义classifier,由附加的插件帮助生成。 |
###依赖
maven通过依赖的方式,引用构件。
<dependencies>
<dependency>
<groupId>cn.com.chujiegroupId>
<artifactId>btartifactId>
<version>1.0.1version>
<type>...type>
<scope>...<scope>
<optional>...optional>
<exclusions>
<exclusion>...exclusion>
exclusions>
dependency>
dependencies>
元素 | 说明 | 是否必填 |
---|---|---|
groupId | 依赖的坐标 | 必填 |
artifactId | 依赖的坐标 | 必填 |
version | 依赖的坐标 | 似乎是非必填,不填默认使用最新的发布版(待定) |
type | 依赖的类型 | 非必填 |
scope | 依赖的范围,后续章节详细说明 | 非必填 |
optional | 标记依赖是否可选,后续章节详细说明 | 非必填,不建议使用。不具备传递特性。 |
exclusions | 排除传递性依赖,后续章节详细说明 | 非必填 |
依赖范围可以控制maven在构建的不同环节中使用不同的依赖构件。
同时依赖范围也对依赖传递性有一定影响,后续文章说明。
元素值 | 说明 | 其他 |
---|---|---|
compile | 编译依赖范围 | 默认的依赖范围,对编译、运行和测试都有效 |
test | 测试依赖范围 | 比如Junit |
provided | 编译和测试时生效,运行时不生效 | 比如servlet-api,运行时由web服务提供。 |
runtime | 运行时依赖范围测试和运行时生效,编译时不生效 | |
system | 系统依赖范围,编译和测试时生效,运行时不生效 | 使用时必须使用systemPath元素显示的指定依赖文件的路径。不建议使用。 |
system依赖范围实例:
<dependency>
<groupId>cn.com.chujiegroupId>
<artifactId>btartifactId>
<version>1.0.1version>
<scope>system<scope>
<systemPath>${java_home}/lib/rt.jarsystemPath>
dependency>
假设A项目依赖B项目,B项目依赖C项目。因依赖的传递性特性,A项目间接的依赖的C项目。
A对B是第一直接依赖,B对C是第二直接依赖。A对C是传递性依赖。
传递性与依赖范围的关系表:
第一列是第一直接依赖、第一行是第二直接依赖
____ | compile | test | provided | runtime |
---|---|---|---|---|
compile | compile | runtime | ||
test | test | test | ||
provided | provided | provided | provided | |
runtime | runtime |
依赖调节(依赖传递性规则)
假设A依赖B,A依赖C-1.0.0,B依赖C-2.0.0。此时maven选取C-1.0.0还是C-2.0.0?
可选依赖不具备传递特性。
假设A依赖B,B依赖C-1.0.0。由于一些原因,不想引入传递性依赖C,而是自己显示依赖C-2.0.0。可以使用exclusions元素声明排除C-1.0.0。
<dependency>
<groupId>cn.com.chujiegroupId>
<artifactId>jdbcartifactId>
<version>1.0.1version>
<exclusions>
<exclusions>
<groupId>cn.com.chujiegroupId>
<artifactId>txartifactId>
exclusions>
<exclusions>
dependency>
<dependency>
<groupId>cn.com.chujiegroupId>
<artifactId>txartifactId>
<version>2.0.0version>
dependency>
使用properties元素定义变量并赋值,在依赖时version元素使用变量。这样可以实现版本统一管理的效果。
mvn:dependency:list 以列表方式查看所有依赖。
mvn dependency:tree 以树方式查看所有依赖。对于查看传递性依赖效果拔群。
mvn dependency:analyze 排查依赖问题。
执行mvn dependency:analyze命令得到两种结果
当mvn执行命令时,先根据命令与生命周期的绑定关系得到对应的周期点(终止点)。再根据生命周期从周期的起始点执行至周期点(终止点)结束。每经过一个周期点,都会查找到与其绑定的命令并执行命令。
阶段名 | 说明 | 插件目标 |
---|---|---|
pre-clean | 执行一些清理前需要完成的工作 | 无 |
clean | 清理上一次构建生成的文件 | maven-clean-plugin:clean |
post-clean | 执行一些清理后需要完成的工作 | 无 |
阶段名 | 说明 | 插件目标 |
---|---|---|
validate | ||
initialize | ||
generate-sources | ||
process-sources | 处理项目主要资源文件。一般来说,是对/src/main/source目录的内容进行变量替换等工作后,复制到项目输出的主classPath目录中。 | |
generate-resources | ||
process-resources | 复制主资源文件至主输出目录 | maven-resources-plugin:resources |
compile | 编译项目的主源码。一般来说,是编译/src/main/java目录下的java文件至项目输出的主classPath目录中。 | maven-compiler-plugin:compile |
process-class | ||
generate-test-sources | ||
process-test-sources | 处理项目测试资源文件。一般来说,是对/src/test/resources目录的内容进行变量替换等工作后,赋值到项目输出的测试classPath目录中。 | |
generate-test-resources | ||
process-test-resources | 复制测试资源文件至测试输出目录 | maven-resources-plugin:testResources |
test-compile | 编译项目的测试代码。一般来说,是编译src/test/java目录下的java文件至项目输出的测试classpath目录中。 | maven-compiler-plugin:testCompile |
process-test-class | ||
test | 使用单元测试框架运行测试,测试代码不会被打包或部署 | mavne-surefire-plugin:test |
prepare-package | ||
package | 接受编译好的代码,打包成可发布的格式,如JAR | maven-jar-plugin:jar |
pre-integration-test | ||
integration-test | ||
post-integration-test | ||
verify | ||
install | 将包安装到Maven本地仓库,供本地其他Maven项目使用。 | maven-install-plugin:install |
deploy | 将最终的包复制到远程仓库,供其他开发人员和Maven项目使用 | maven-deploy-plugin:deploy |
阶段名 | 说明 | 其他 |
---|---|---|
pre-site | 执行一些在生成项目站点之前需要完成的工作 | |
site | 生成项目站点文档。 | |
post-site | 执行一些在生成项目站点之后需要完成的工作 | |
site-deploy | 将生成的项目站点发布到服务器上。 |
一个插件不仅仅完成一项工作,根据不同的动作口令可以完成多种工作。
mvn 插件名:目标口令
例如
mvn:dependency:list 以列表方式查看所有依赖。
mvn dependency:tree 以树方式查看所有依赖。对于查看传递性依赖效果拔群。
生命周期与插件的相互关联。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-source-pluginartifactId>
<version>2.1.1version>
<executions>
<execution>
<id>attach-sourcesid>
<phase>verifyphase>
<goals>
<goal>jar-no-forkgoal>
goals>
execution>
executions>
plugin>
plugins>
build>
标签名 | 说明 | 其他 |
---|---|---|
build>plugins>plugin | 声明插件的使用 | 可多个 |
executions>execution | 声明插件的执行任务 | 可多个 |
executions>execution>id | 为执行任务定义别名 | |
phase | 为插件目标与生命周期中某个环节绑定关联关系 | 此处可省略,部分插件目标内设此参数。查看命令mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail |
goals>goal | 指定要执行的插件目标 | 可多个(效果待定) |
几乎所有maven插件都有一些可配置的参数,用户可以通过命令行和pom配置等方式进行参数配置。通过参数配置使插件执行出不同效果,以满足项目的需求。
-- 跳过测试
mvn install -Dmaven.test.skip=true
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version><2.1/version>
<configuration>
<source>1.5source>
<target>1.5target>
configuration>
plugin>
plugins>
build>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version><2.1/version>
<executions>
<execution>
<id>ant-validateid>
<phase>validatephase>
<goals>
<goal>
run
goal>
goals>
<configuration>
<tasks>
<echo>命令行输出内容1echo>
tasks>
configuration>
execution>
<execution>
<id>ant-verifyid>
<phase>verifyphase>
<goals>
<goal>
run
goal>
goals>
<configuration>
<tasks>
<echo>命令行输出内容2echo>
tasks>
configuration>
execution>
executions>
plugin>
plugins>
build>
mvn 插件名:动作名
maven为部分插件定义了前缀,类似于别名。通过别名有助于记忆和使用插件。
// 查看指定插件指定版本信息
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1
// 查看指定插件最新版本信息
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin
// 通过插件别名查看信息
mvn help:describe -Dplugin=compiler
// 查看插件某个目标的信息
mvn help:describe -Dplugin=compiler -Dgoal=testCompile
如果插件是Maven的官方插件(org.apache.maven.plugins),可以省略groupId配置。
元素名 | 元素说明 |
---|---|
groupId | 项目组ID,项目坐标的核心元素 |
version | 项目版本,项目坐标的核心元素 |
description | 项目的描述信息 |
organization | 项目的组织信息 |
inceptionYear | 项目的创始年份 |
url | 项目的URL |
developers | 项目的开发者信息 |
contributors | 项目的贡献者信息 |
distributionManagement | 项目的部署配置 |
issueManagement | 项目的缺陷跟踪系统信息 |
ciManagement | 项目的持续集成系统信息 |
scm | 项目的版本控制系统信息 |
mailingLists | 项目的邮件列表信息 |
properties | 项目的自定义maven属性 |
dependencies | 项目的依赖配置 |
dependencyManagement | 项目的依赖管理配置 |
repositories | 项目的仓库配置 |
build | 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等 |
reporting | 包括项目的报告输出目录配置、报告插件配置等 |
Maven提倡“约定优于配置”,这是Maven最核心的设计理念之一。
任何一个Maven项目都隐试的继承超级POM,大量超级POM的配置都会被所有Maven项目所继承。这些配置也就成为了Maven所提倡的约定。
在一个多模块的Maven项目中,反应堆是指所有模块组成的一个构建结构。对于单模块的项目,反应堆就是该模块自身。
Maven按序读取POM,如果该POM没有依赖模块,就构建该模块,否则就先构建其依赖模块,如果该依赖模块还依赖于其他模块,则进一步先构建依赖的依赖。
命令 | 说明 | 实例 |
---|---|---|
-pl | 构建指定模块,模块之间用逗号分隔。 | mvn clean install -pl superA,sunB |
-am | 同时构建所列模块的依赖模块 | mvn clean install -am sunB |
-amd | 同时构建依赖于所列模块的模块 | mvn clean install -amd superA |
-rf | 从指定的模块回复反应堆 |
命令可以组合使用
属性名 | 说明 |
---|---|
内置属性 | 主要有两个常用内置属性—— b a s e d i r 表 示 项 目 根 目 录 , 即 包 含 p o m . x m l 文 件 的 目 录 ; {basedir} 表示项目根目录,即包含pom.xml文件的目录; basedir表示项目根目录,即包含pom.xml文件的目录;{version} 表示项目版本 |
POM属性 | 用户可以使用该类属性引用POM文件中对应元素的值。例如${project.artifactId} 就对应了 元素的值 |
自定义属性 | 用户可以在POM的元素下自定义Maven属性。 |
Settings属性 | 用户使用settings. 开头的属性引用settings.xml文件中XML元素的值。 |
JAVA系统属性 | 所有java系统属性都可以使用Maven属性引用,例如${user.home} 指向了用户目录。用户可以使用mvn help:system查看所有java属性 |
环境变量属性 | 用户使用env.开头的属性引用环境变量的值。例如${env.JAVA_HOME} 指代了JAVA_HOME的值 |
在不同的环境下编译项目,使用不同的配置内容。
首先在pom文件中配置不同环境下不同的配置信息。
<profiles>
<profile>
<id>devid>
<properties>
<db.dirver>com.mysql.jdbc.Driverdb.dirver>
<db.url>jdbc:mysql://192.168.1.1:3306/testdb.url>
<db.username>devdb.username>
<db.password>123456db.password>
properties>
profile>
<profile>
<id>testid>
<properties>
<db.dirver>com.mysql.jdbc.Driverdb.dirver>
<db.url>jdbc:mysql://192.168.1.1:3306/testdb.url>
<db.username>testdb.username>
<db.password>123456db.password>
properties>
profile>
profiles>
然后再开启资源过滤功能
<build>
<resources>
<resource>
<directory>E:\projects\springtest\src\main\resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
build>
最后在命令后添加指定profile语句
mvn clean install -Pdev
//同时启动dev-x和dev-y
mvn package -Pdev-x,dev-y
<settings>
<activeProfiles>
<activeProfile>dev-xactiveProfile>
activeProfiles>
settings>
<profiles>
<profile>
<activation>
<property>
<name>devname>
<value>xvalue>
property>
<activation>
profile>
profiles>
<profiles>
<profile>
<activation>
<os>
<name>Windows XPname>
<family>Windowsfamily>
<arch>x86arch>
<version>5.1.2600version>
os>
activation>
profile>
profiles>
name arch version用户可通过查看环境中系统属性os.name os.arch os.version得知。
<profiles>
<profile>
<activation>
<file>
<messing>x.propertiesmessing>
<exists>y.propertiesexists>
file>
activation>
profile>
profiles>
<profiles>
<profile>
<id>devid>
<activation>
<activeByDefault>trueactiveByDefault>
actiation>
profile>
profiles>
mvn help:active-profiles
mvn help:all-profiles
名称 | 说明 |
---|---|
pom.xml | pom.xml文件中声明的profile,只对当前项目生效 |
用户settings.xml | 用户目录下.m2/settings.xml中声明的profile,对本机当前用户下所有项目生效 |
全局setting.xml | Maven安装目录下conf/settings.xml中声明的profile,对本机所有项目生效 |
profiles.xml | 已作废,在项目根目录下创建profile.xml文件声明profile |
命令 | 作用 | 其他 |
---|---|---|
mvn clean | 清理构件产出物 | 无 |
mvn install | 添加构件至本地仓库 | 无 |
mvn:dependency:list | 以列表方式查看所有依赖。 | 无 |
mvn dependency:tree | 以树方式查看所有依赖。对于查看传递性依赖效果拔群。 | 无 |
mvn dependency:analyze | 排查依赖问题。 | 无 |
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-so | ||
urce-plugin:2.1.1 -Ddetail | 输出对应插件的详细信息 | |
mvn help:desc | 排查依赖问题。 | 无 |
网址 | 作用 | 其他 |
---|---|---|
https://repository.sonatype.org | 提供maven构件检索功能 | 无 |
http://mvnrepository.com | 提供maven构件检索功能 | 无 |
http://maven.apache.org/plugins/ | 提供maven插件说明 | 无 |
http://repo1.maven.org/maven2/org/apache/maven/plugins/ | 提供maven插件下载 | 无 |