Maven3记录A

Maven3记录A

本文章用于在学习maven过程中,记录知识点使用。

maven的作用

  • 构建项目
  • 依赖管理

maven的安装

参考:maven安装
建议:不要使用IDE内嵌的maven插件。通过命令行执行maven操作。

POM

坐标

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>

Maven3记录A_第1张图片

依赖的传递性

假设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命令得到两种结果

  • used undeclared dependencies (使用但未明确声明的依赖)
    主代码和测试代码中使用了通过传递性特性所依赖的构件。当直接依赖构件升级版本时,相关传递性依赖也会升级。存在潜在危险,建议显示声明项目中用到的依赖。
  • unused deciared dependencies (未使用但声明的依赖)
    未使用的依赖构件。由于dependency:analyze只能分析主代码和测试代码用到的依赖,有可能是项目在运行时候或依赖构件内部使用的。所以不能直接将构件删除。

生命周期

当mvn执行命令时,先根据命令与生命周期的绑定关系得到对应的周期点(终止点)。再根据生命周期从周期的起始点执行至周期点(终止点)结束。每经过一个周期点,都会查找到与其绑定的命令并执行命令。

  • clean生命周期
阶段名 说明 插件目标
pre-clean 执行一些清理前需要完成的工作
clean 清理上一次构建生成的文件 maven-clean-plugin:clean
post-clean 执行一些清理后需要完成的工作
  • default生命周期
阶段名 说明 插件目标
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
  • site生命周期
阶段名 说明 其他
pre-site 执行一些在生成项目站点之前需要完成的工作
site 生成项目站点文档。
post-site 执行一些在生成项目站点之后需要完成的工作
site-deploy 将生成的项目站点发布到服务器上。

插件

插件目标

一个插件不仅仅完成一项工作,根据不同的动作口令可以完成多种工作。
mvn 插件名:目标口令
例如
mvn:dependency:list 以列表方式查看所有依赖。
mvn dependency:tree 以树方式查看所有依赖。对于查看传递性依赖效果拔群。

插件绑定

生命周期与插件的相互关联。

  • 内置绑定:maven本身为生命周期的部分周期点绑定的插件目标,称为内置绑定。
  • 自定义绑定:用户自己选择将某个插件目标绑定到生命周期的某个阶段上。
<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配置等方式进行参数配置。通过参数配置使插件执行出不同效果,以满足项目的需求。

  • 命令行插件配置:在命令行中使用-D参数,并伴随一个参数键=参数值的形式。
-- 跳过测试
mvn install -Dmaven.test.skip=true
  • POM中插件全局配置。
<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>
  • POM中插件任务配置。
<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

默认的默认GroupId

如果插件是Maven的官方插件(org.apache.maven.plugins),可以省略groupId配置。

聚合于继承

  • 聚合:将maven项目视为maven模块,多个模块组合在一起称为聚合。
  • 继承:将两个maven项目视为父子关系,子项目继承父项目的pom中部分元素。

可继承的POM元素

元素名 元素说明
groupId 项目组ID,项目坐标的核心元素
version 项目版本,项目坐标的核心元素
description 项目的描述信息
organization 项目的组织信息
inceptionYear 项目的创始年份
url 项目的URL
developers 项目的开发者信息
contributors 项目的贡献者信息
distributionManagement 项目的部署配置
issueManagement 项目的缺陷跟踪系统信息
ciManagement 项目的持续集成系统信息
scm 项目的版本控制系统信息
mailingLists 项目的邮件列表信息
properties 项目的自定义maven属性
dependencies 项目的依赖配置
dependencyManagement 项目的依赖管理配置
repositories 项目的仓库配置
build 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
reporting 包括项目的报告输出目录配置、报告插件配置等

依赖管理

  • dependencies
    父项目中使用此标签引用的依赖,依赖将作用于父项目与存在继承关系的子项目。
  • dependencyManagement
    在该元素中配置的依赖不会直接生效,当POM中配置了真正的dependency元素,并且groupId和artifactId与dependencyManagement中配置的依赖匹配时,dependencyManagement配置才会生效。

插件管理

  • pluginManagement
    在该元素中配置的插件不会造成插件调用行为,当POM中配置了真正的plugin元素,并且groupId和artifactId与pluginManagement中配置的插件匹配时,pluginManagement配置才会影响实际的插件行为。

约定优于配置

Maven提倡“约定优于配置”,这是Maven最核心的设计理念之一。

超级POM

任何一个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 从指定的模块回复反应堆

命令可以组合使用

灵活的构建

Maven属性

属性名 说明
内置属性 主要有两个常用内置属性—— b a s e d i r 表 示 项 目 根 目 录 , 即 包 含 p o m . x m l 文 件 的 目 录 ; {basedir} 表示项目根目录,即包含pom.xml文件的目录; basedirpom.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

激活profile的方式

  • 命令行激活
    命令行参数-P加上profile的id来激活profile,多个id之间以逗号分隔。
//同时启动dev-x和dev-y
mvn package -Pdev-x,dev-y
  • settings文件显示激活
    通过配置settings文件,可控制所有项目的默认激活profile。
<settings>
	<activeProfiles>
		<activeProfile>dev-xactiveProfile>
	activeProfiles>
settings>
  • 系统属性激活
    通过判断系统属性是否存在,是否等于固定值,来控制profile的激活。
<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>

查看项目当前profile激活情况

mvn help:active-profiles

查看项目所有profile情况

mvn help:all-profiles

profile的种类

名称 说明
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插件下载

你可能感兴趣的:(maven)