Maven3记录A

Maven3记录A

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

maven的作用

  • 构建项目
  • 依赖管理

maven的安装

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

POM

坐标

maven使用坐标规则为任何构建进行唯一标识。坐标是依赖的基础。
maven通过groupId、artifactId、version、packaging、classifier元素定义坐标。

		<groupId>cn.com.chujie</groupId>
		<artifactId>spring-boot-test</artifactId>
        <version>1.0</version>
        <packaging>war</packaging>
元素说明是否必填
groupId定义当前Maven项目隶属的实际项目必填
artifactId该元素定义当前实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀必填
version该元素定义了使用构件的版本必填
packaging定义Maven项目打包的方式,常用jar和war。非必填,默认jar
classifier该元素用来帮助定义构建输出的一些附件。不可填,不能直接定义classifier,由附加的插件帮助生成。

###依赖
maven通过依赖的方式,引用构件。

<dependencies>
	<dependency>
	    <groupId>cn.com.chujie</groupId>
	    <artifactId>bt</artifactId>
	    <version>1.0.1</version>
	    <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.chujie</groupId>
	    <artifactId>bt</artifactId>
	    <version>1.0.1</version>
	    <scope>system<scope>
	    <systemPath>${java_home}/lib/rt.jar</systemPath>
</dependency>

在这里插入图片描述

依赖的传递性

假设A项目依赖B项目,B项目依赖C项目。因依赖的传递性特性,A项目间接的依赖的C项目。
A对B是第一直接依赖,B对C是第二直接依赖。A对C是传递性依赖。
传递性与依赖范围的关系表:
第一列是第一直接依赖、第一行是第二直接依赖

____compiletestprovidedruntime
compilecompileruntime
testtesttest
providedprovidedprovidedprovided
runtimeruntime

依赖调节(依赖传递性规则)
假设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.chujie</groupId>
	    <artifactId>jdbc</artifactId>
	    <version>1.0.1</version>
	    <exclusions>
			<exclusions>
				<groupId>cn.com.chujie</groupId>
			    <artifactId>tx</artifactId>
			</exclusions>
		<exclusions>
</dependency>
<dependency>
	    <groupId>cn.com.chujie</groupId>
	    <artifactId>tx</artifactId>
	    <version>2.0.0</version>
</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接受编译好的代码,打包成可发布的格式,如JARmaven-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.plugins</groupId>
			<artifactId>maven-source-plugin</artifactId>
			<version>2.1.1</version>
			<executions>
				<execution>
					<id>attach-sources</id>
					<phase>verify</phase>
					<goals>
						<goal>jar-no-fork</goal>
					</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.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version><2.1/version>
			<configuration>
				<source>1.5</source>
				<target>1.5</target>
			</configuration>
		</plugin>
	</plugins>
</build>
  • POM中插件任务配置。
<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version><2.1/version>
			<executions>
				<execution>
					<id>ant-validate</id>
					<phase>validate</phase>
					<goals>
						<goal>
							run
						</goal>
					</goals>
					<configuration>
						<tasks>
							<echo>命令行输出内容1</echo>
						</tasks>
					</configuration>
				</execution>
				<execution>
					<id>ant-verify</id>
					<phase>verify</phase>
					<goals>
						<goal>
							run
						</goal>
					</goals>
					<configuration>
						<tasks>
							<echo>命令行输出内容2</echo>
						</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>dev</id>
		<properties>
			<db.dirver>com.mysql.jdbc.Driver</db.dirver>
			<db.url>jdbc:mysql://192.168.1.1:3306/test</db.url>
			<db.username>dev</db.username>
			<db.password>123456</db.password>
		</properties>
	</profile>
	<profile>
		<id>test</id>
		<properties>
			<db.dirver>com.mysql.jdbc.Driver</db.dirver>
			<db.url>jdbc:mysql://192.168.1.1:3306/test</db.url>
			<db.username>test</db.username>
			<db.password>123456</db.password>
		</properties>
	</profile>
</profiles>

然后再开启资源过滤功能

<build>
    <resources>
      <resource>
        <directory>E:\projects\springtest\src\main\resources</directory>
        <filtering>true</filtering>
      </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-x</activeProfile>
	</activeProfiles>
</settings>
  • 系统属性激活
    通过判断系统属性是否存在,是否等于固定值,来控制profile的激活。
<profiles>
	<profile>
		<activation>
			<property>
				<name>dev</name>
				<!-- value属性可选 没有则判断存在性 有则判断一致性 -->
				<value>x</value>
			</property>
		<activation>
	</profile>
</profiles>
  • 操作系统环境激活
    根据操作系统的区别进行激活。
<profiles>
	<profile>
		<activation>
			<os>
				<name>Windows XP</name>
				<family>Windows</family>
				<arch>x86</arch>
				<version>5.1.2600</version>
			</os>
		</activation>
	</profile>
</profiles>

name arch version用户可通过查看环境中系统属性os.name os.arch os.version得知。

  • 文件存在与否激活
<profiles>
	<profile>
		<activation>
			<file>
				<messing>x.properties</messing>
				<exists>y.properties</exists>
			</file>
		</activation>
	</profile>
</profiles>
  • 默认激活
<profiles>
	<profile>
		<id>dev</id>
		<activation>
			<activeByDefault>true</activeByDefault>
		</actiation>
	</profile>
</profiles>
查看项目当前profile激活情况
mvn help:active-profiles
查看项目所有profile情况
mvn help:all-profiles
profile的种类
名称说明
pom.xmlpom.xml文件中声明的profile,只对当前项目生效
用户settings.xml用户目录下.m2/settings.xml中声明的profile,对本机当前用户下所有项目生效
全局setting.xmlMaven安装目录下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插件下载
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值