Maven实战
2017-07-25 23:25:42 272 举报
AI智能生成
《maven实战》这本书的思维导图
作者其他创作
大纲/内容
什么是Maven
Maven主要是基于Java平台的项目构建、依赖管理和项目信息管理
Build-每天有很多的时间花在了编译、运行单元测试。生成文档,打包和部署等
繁琐且不起眼的工作上,这个就是构建
繁琐且不起眼的工作上,这个就是构建
Maven可以帮助我们自动化构建过程,从清理、编译、测试到生成报告,再到打包部署
Maven的安装和配置
安装Maven
安装目录分析
bin:包含了运行的脚本文件,包括
shell脚本和bat脚本(新版更新成了cmd脚本)
shell脚本和bat脚本(新版更新成了cmd脚本)
boot:一个类加载器框架,提供了更加丰富的语法
conf:里面的settings.xml可以全局控制Maven的行为
lib:包含了Maven运行时需要的Java类库
~/.m2文件夹
默认包含Maven的本地仓库.m2/repository
Maven使用入门
编写POM
groupId、artifactId、version这三个元素定义了一个项目基本的坐标
编写主代码
主代码位于 src/main/java目录
编写测试代码
测试代码位于 src/test/java目录
打包和运行
当没有在POM中指定打包类型时,使用默认的jar进行打包
如果希望其他的Maven项目引用,需要使用 mvn install 这个命令
使用Archetype生成项目结构
mvn archetype : generate
如果希望其他的Maven项目引用,需要使用 mvn install 这个命令
坐标和依赖
何为Maven坐标
包含groupId、artifactId、version、packaging、classifier
坐标详解
packaging:有jar、war等。缺省值为:jar
classifier: 定义一些附属构建,不能直接定义项目的classifier,是由附加的插件帮助生成的
依赖的配置
<dependencies>下<dependency>标签
groupId、artifactId、version坐标
type:依赖的类型
scope:依赖的范围
optional:标记依赖是否可选
exclusions:排除传递性依赖
groupId、artifactId、version坐标
type:依赖的类型
scope:依赖的范围
optional:标记依赖是否可选
exclusions:排除传递性依赖
依赖范围(scope)
有三种classpath(编译classpath、测试classpath、运行classpath)
compile:编译依赖范围,对三种classpath都有效;
test:测试依赖范围,只对测试classpath有效;
provided:已提供依赖范围,只对编译和测试classpath有效;
runtime:运行时依赖范围,对测试、运行classpath有效;
system:系统依赖范围,只对编译和测试classpath有效。(这种依赖是不通过maven仓库找依赖包的,会从systemPath指定的路径中寻找依赖包,所以不具备移植性)
import:导入依赖范围。
test:测试依赖范围,只对测试classpath有效;
provided:已提供依赖范围,只对编译和测试classpath有效;
runtime:运行时依赖范围,对测试、运行classpath有效;
system:系统依赖范围,只对编译和测试classpath有效。(这种依赖是不通过maven仓库找依赖包的,会从systemPath指定的路径中寻找依赖包,所以不具备移植性)
import:导入依赖范围。
传递性依赖
传递性依赖的又意思就是:A->B,B->C,=>A->C
------------------------------------------------------------
compile test provided runtime
------------------------------------------------------------
compile compile —— —— runtime
test test —— —— test
provided provided —— provided provided
runtime runtime —— —— runtime
compile test provided runtime
------------------------------------------------------------
compile compile —— —— runtime
test test —— —— test
provided provided —— provided provided
runtime runtime —— —— runtime
依赖调节
依赖调节第一原则:路径最近者优先
依赖调节第二原则:第一声明者优先(也就是在POM先定义的先依赖)
依赖调节第二原则:第一声明者优先(也就是在POM先定义的先依赖)
可选依赖
A->B, B->可选C, B->可选D, 则 C,D不会被传递依赖给A
最佳实践
排除依赖:<exclusions>下的<exclusion>标签
归类依赖:<properties>中定义一个元素test,以后需要的地方直接引用${test}
优化依赖:mvn dependency:list 查看当前项目已解析依赖
mvn dependency:tree 查看依赖树
mvn dependency:analyze 分析依赖树
mvn dependency:tree 查看依赖树
mvn dependency:analyze 分析依赖树
仓库
什么是maven仓库
在某个统一的位置存储所有的Maven项目构件,这个统一的位置就是仓库
仓库的布局
根据构件的坐标定义存储路径
仓库的分类
本地仓库:<localRepository></localRepository>
mvn clean install 命令会将当前构件安装到本地仓库中去
远程仓库的配置
在Pom文件中配置远程仓库<repository>...</repository>
releases和snapshots包含 updatePolicy和checksumPolicy :
updatePolicy:表示maven从远程仓库检查更新的频率。(never,默认always,interval:X每个x分钟检查)
checksumPolicy:下载artifact时,进行文件校验。(默认warn,fail,ignore)
updatePolicy:表示maven从远程仓库检查更新的频率。(never,默认always,interval:X每个x分钟检查)
checksumPolicy:下载artifact时,进行文件校验。(默认warn,fail,ignore)
在settings.xml文件中添加<server>...</servers>中的<id></id>会和Pom中的仓库对应
部署artifact至远程仓库:<distributionManagement>...</distributionManagement>
部署artifact命令:mvn clean deploy
部署artifact命令:mvn clean deploy
快照版本:snapshot,maven会自动加上版本号
当有依赖时,maven会自定进行最新版本的artifact下载,maven默认每天检查一次,也就是仓库的updatePolicy属性,也可以使用 mvn clean install-U 属性强制检查更新
当有依赖时,maven会自定进行最新版本的artifact下载,maven默认每天检查一次,也就是仓库的updatePolicy属性,也可以使用 mvn clean install-U 属性强制检查更新
从仓库解析依赖的机制
1.2这种显示版本:本地仓库---> 远程仓库
-----------------------------------------------------------------------------------------------------
release和latest:读取所有远程仓库元数据maven-metadata.xml--->与本地仓库元数据合并---> 计算release和latest的真实值--->本地仓库寻找--->远程仓库寻找--->将真实值 替换成release和latest,修改artifact名字并使用
-----------------------------------------------------------------------------------------------------
snapshot:读取所有远程仓库元数据maven-metadata.xml--->与本地仓库元数据合并---> 计算snapshot的真实值--->本地仓库寻找--->远程仓库寻找--->替换成release和lates t,修改artifact名字并使用
-----------------------------------------------------------------------------------------------------
release和latest:读取所有远程仓库元数据maven-metadata.xml--->与本地仓库元数据合并---> 计算release和latest的真实值--->本地仓库寻找--->远程仓库寻找--->将真实值 替换成release和latest,修改artifact名字并使用
-----------------------------------------------------------------------------------------------------
snapshot:读取所有远程仓库元数据maven-metadata.xml--->与本地仓库元数据合并---> 计算snapshot的真实值--->本地仓库寻找--->远程仓库寻找--->替换成release和lates t,修改artifact名字并使用
镜像
在settings配置文件中添加<mirror>...</mirror>
<mirrorOf>id</mirrorOf>表示仓库劫持,任何对id仓库的访问都会劫持到镜像仓库中去
<mirrorOf>id</mirrorOf>表示仓库劫持,任何对id仓库的访问都会劫持到镜像仓库中去
生命周期和插件
何为生命周期
maven的生命周期:清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成
maven的生命周期本身不做任何工作,实际工作(如编译)是由插件来完成的
生命周期详解
maven有三套生命周期,clean:清理项目、default:构建项目、site:建立项目站点
每个生命周期包含一些phase(阶段),后面的phase依赖于前面的phase
clean生命周期:
pre-clean:
clean:
post-clean:
pre-clean:
clean:
post-clean:
default生命周期:validate:
initialize:
generate-sources:
process-sources:处理项目主资源文件。对/src/main/resources目录的内容进 行变量替换,复制到项目输出的主ClassPath目录中
generate-resources:
process-resources:
compile:编译项目的主源码。src/main/java
process-classes:
generate-test-sources:
process-test-sources:处理项目测试资源文件。src/test/resources
generate-test-resources:
process-test-resources:
test-compile:编译项目的测试代码。src/test/java
process-test-classes:
test:使用单元测试框架进行测试,测试代码不会打包和部署
prepare-package:
papckage:使用编译好的代码,打包成可发布的版本,如JAR
pre-integration-test:
integration-test:
post-integration-test:
verify:
install:将包安装到Maven本地仓库,供本地其他项目使用
deploy:将artifact复制到远程仓库,供其他项目使用
initialize:
generate-sources:
process-sources:处理项目主资源文件。对/src/main/resources目录的内容进 行变量替换,复制到项目输出的主ClassPath目录中
generate-resources:
process-resources:
compile:编译项目的主源码。src/main/java
process-classes:
generate-test-sources:
process-test-sources:处理项目测试资源文件。src/test/resources
generate-test-resources:
process-test-resources:
test-compile:编译项目的测试代码。src/test/java
process-test-classes:
test:使用单元测试框架进行测试,测试代码不会打包和部署
prepare-package:
papckage:使用编译好的代码,打包成可发布的版本,如JAR
pre-integration-test:
integration-test:
post-integration-test:
verify:
install:将包安装到Maven本地仓库,供本地其他项目使用
deploy:将artifact复制到远程仓库,供其他项目使用
site生命周期:建立和发布项目站点
pre-site:
site:生成项目站点文档
post-site:
site-deploy:将生成的项目站点发布到服务器上
pre-site:
site:生成项目站点文档
post-site:
site-deploy:将生成的项目站点发布到服务器上
插件目标
多个功能聚集在一个插件里,每个功能对应一个插件的目标:
ie. dependency:anlyze--->分析项目依赖
dependency:tree--->画出项目的依赖树
dependency:list--->列出项目的依赖
ie. dependency:anlyze--->分析项目依赖
dependency:tree--->画出项目的依赖树
dependency:list--->列出项目的依赖
插件绑定
生命周期的phase与plugin 的goal绑定在一起完成工作,
ie,default的compile与maven-compiler-plugin:compile目标绑定在一起
ie,default的compile与maven-compiler-plugin:compile目标绑定在一起
内置的绑定:clean
------------------------------------------------------------
生命周期阶段 插件目标
------------------------------------------------------------
pre-clean
clean maven-clean-plugin:clean
post-clean
------------------------------------------------------------
生命周期阶段 插件目标
------------------------------------------------------------
pre-clean
clean maven-clean-plugin:clean
post-clean
内置的绑定:site
------------------------------------------------------------
生命周期阶段 插件目标
------------------------------------------------------------
pre-clean
site maven-site-plugin:site
post-site
site-deploy maven-site-plugin:deploy
------------------------------------------------------------
生命周期阶段 插件目标
------------------------------------------------------------
pre-clean
site maven-site-plugin:site
post-site
site-deploy maven-site-plugin:deploy
内置的绑定:default(jar)
----------------------------------------------------------------------------------------------
生命周期阶段 插件目标
----------------------------------------------------------------------------------------------
process-resources maven-resources-plugin : resources
compile maven-compiler-plugin : compile
process-test-resources maven-resources-plugin : testResources
test-compile maven-compiler-plugin : testCompile
test maven-surefire-plugin : test
package maven-jar-plugin : jar
install maven-install-plugin : install
deploy maven-deploy-plugin : deploy
----------------------------------------------------------------------------------------------
生命周期阶段 插件目标
----------------------------------------------------------------------------------------------
process-resources maven-resources-plugin : resources
compile maven-compiler-plugin : compile
process-test-resources maven-resources-plugin : testResources
test-compile maven-compiler-plugin : testCompile
test maven-surefire-plugin : test
package maven-jar-plugin : jar
install maven-install-plugin : install
deploy maven-deploy-plugin : deploy
自定义绑定:<bulid>
<plugins>
<plugin>
<executions>
<execution>
<id>...</id>
<phase>...</phase>
<goals>
<goal>...</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
当多个 plugin:goals 绑定到 同一个phase时,按照绑定的顺序执行
<plugins>
<plugin>
<executions>
<execution>
<id>...</id>
<phase>...</phase>
<goals>
<goal>...</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
当多个 plugin:goals 绑定到 同一个phase时,按照绑定的顺序执行
插件配置
命令行插件配置:-Dkey=value ig:mvn install -Dmaven.test.skip=true
POM插件配置:当configuration放在<plugin>下时,表示这个是全局配置
在<plugin>
<configuration>
......
</configuration>
</plugin>
在<plugin>
<configuration>
......
</configuration>
</plugin>
POM中插件任务配置:当configuration放在<execution>下时,表示这个是特定任务
<execution>
<configuration>
</configuration>
</execution>
<execution>
<configuration>
</configuration>
</execution>
获取插件信息
在线插件信息
使用maven-help-plugin 描述插件:
mvn help:describe
mvn help:describe
从命令行调用插件
mvn dependency:tree
之所以可以使用dependency代替groupId:artifactId:version,是因为后者artifactId的前缀的值是前者
之所以可以使用dependency代替groupId:artifactId:version,是因为后者artifactId的前缀的值是前者
插件解析机制
插件仓库:
<pluginRepositories>
<pluginRepository>
</pluginRepository>
</pluginRepositories>
<pluginRepositories>
<pluginRepository>
</pluginRepository>
</pluginRepositories>
插件的默认groupId:
若插件为Maven的官方插件,则在POM配置中可以省略groupId的值org.apache.maven.plugins
若插件为Maven的官方插件,则在POM配置中可以省略groupId的值org.apache.maven.plugins
解析插件版本:
1,在super POM中设定了核心插件的版本,当用户使用核心插件时,不指定版本,就会使用 super POM中的版本
2,若使用了非核心插件,且没有指定版本,则会检查所有插件仓库中的版本,解析到最新的 release版本(maven2 会解析至latest,maven3 会解析至release)
1,在super POM中设定了核心插件的版本,当用户使用核心插件时,不指定版本,就会使用 super POM中的版本
2,若使用了非核心插件,且没有指定版本,则会检查所有插件仓库中的版本,解析到最新的 release版本(maven2 会解析至latest,maven3 会解析至release)
解析插件前缀:
1,会查询groupId/maven-metadata.xml
2,groupId默认的值为:org.apache.maven.plugins 和 org.codehaus.mojo(因为大部分的插件 都是这两个仓库开发的)
3,如果想在检查其他的仓库元数据,在settings.xml中添加
<settings>
<pluginGroups>
<pluginGroup>......</pluginGroup>
</pluginGroups>
</settings>
1,会查询groupId/maven-metadata.xml
2,groupId默认的值为:org.apache.maven.plugins 和 org.codehaus.mojo(因为大部分的插件 都是这两个仓库开发的)
3,如果想在检查其他的仓库元数据,在settings.xml中添加
<settings>
<pluginGroups>
<pluginGroup>......</pluginGroup>
</pluginGroups>
</settings>
聚合和继承
聚合
创建一个额外的聚合maven项目,包含多个maven项目,这样就可以统一构建多个maven项目
聚合的maven项目<packaging>pom</packaging>(packaging的打包方式必须为pom)
<modules>
<module>maven项目一(相对路径)</module>
<module>maven项目二(相对路径)</module>
</modules>
聚合的maven项目<packaging>pom</packaging>(packaging的打包方式必须为pom)
<modules>
<module>maven项目一(相对路径)</module>
<module>maven项目二(相对路径)</module>
</modules>
聚合项目与其他maven项目即可以是父子关系,也可以是平行关系,只需要<module>相对路径配置正确即可
继承
可以将子模块中公共的部分提取出来,放到父模块中。
父模块的打包方式为pom,子模块的pom中需要继承父模块的pom
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<relativePath>../account-parent/pom.xml(相对路径)</relativePath>
</parent>
可以继承的pom元素:
groupId:项目组ID
version:项目的版本
description:项目的描述信息
organization:项目的组织信息
inceptionYear:项目的创始年份
url:项目的URL地址
developers:项目的开发者信息
contributors:项目的贡献者信息
distributionManagement:项目的部署配置
issueManagement:项目的缺陷跟踪系统信息
ciManagement:项目的持续集成系统信息
scm:项目版本控制信息
mailingLists:项目的邮件列表信息
properties:自定义的maven属性
dependencies:项目的依赖配置
dependencyManagement:项目的依赖管理配置
repositories:项目仓库地址配置
build:项目源码目录配置、输出目录配置、插件配置、插件管理配置
reporting:项目的报告输出目录配置、报告插件配置
groupId:项目组ID
version:项目的版本
description:项目的描述信息
organization:项目的组织信息
inceptionYear:项目的创始年份
url:项目的URL地址
developers:项目的开发者信息
contributors:项目的贡献者信息
distributionManagement:项目的部署配置
issueManagement:项目的缺陷跟踪系统信息
ciManagement:项目的持续集成系统信息
scm:项目版本控制信息
mailingLists:项目的邮件列表信息
properties:自定义的maven属性
dependencies:项目的依赖配置
dependencyManagement:项目的依赖管理配置
repositories:项目仓库地址配置
build:项目源码目录配置、输出目录配置、插件配置、插件管理配置
reporting:项目的报告输出目录配置、报告插件配置
1,dependencyManagement元素能让子模块继承到父模块的依赖配置,在dependencyManagement中声明的依赖不会引入实际的依赖。可以在父模块的dependencyManagement中添加如下配置:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
子模块需要使用这个依赖时:
子模块需要使用这个依赖时:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
虽然相比于之前,只少了版本这一行,但是可以统一整个项目中的依赖版本号。推荐使用
2,当想在另外一个项目中使用相同的dependencyManagement时,可以使用import范围依赖:
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<type>pom</type>(type只能是pom类型)
<scope>import</scope>
</dependency>
虽然相比于之前,只少了版本这一行,但是可以统一整个项目中的依赖版本号。推荐使用
2,当想在另外一个项目中使用相同的dependencyManagement时,可以使用import范围依赖:
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<type>pom</type>(type只能是pom类型)
<scope>import</scope>
</dependency>
插件管理:
pluginManagement元素集中管理插件,xml配置文件信息如上
pluginManagement元素集中管理插件,xml配置文件信息如上
聚合与继承的关系:
聚合:聚合模块知道哪些被聚合的模块,但被聚合的模块不知道聚合模块的存在
继承:父POM不知道子模块,但子模块都知道父POM的存在
可以将聚合和继承的代码都放到同一个pom文件中
聚合:聚合模块知道哪些被聚合的模块,但被聚合的模块不知道聚合模块的存在
继承:父POM不知道子模块,但子模块都知道父POM的存在
可以将聚合和继承的代码都放到同一个pom文件中
约定优于配置:
反应堆的构建顺序:
1,maven按顺序读取pom,如果该pom没有依赖模块,那么就构建该模块
2,否则就先构建其依赖的模块
3,如果该依赖还依赖其它的模块,则进一步先构建依赖的依赖
1,maven按顺序读取pom,如果该pom没有依赖模块,那么就构建该模块
2,否则就先构建其依赖的模块
3,如果该依赖还依赖其它的模块,则进一步先构建依赖的依赖
裁剪反应堆:
1,-am(--also-make):构建所列模块的依赖模块
2,-amd(--also-make-dependents):构建所列模块的依赖模块,构建依赖于依赖模块的其它 模块
3,-pl(--projects):构建指定的模块,模块间用逗号隔开
4, -rf(--resume-from):在完整的反应堆上,指定从哪个模块开始往后构建
1,-am(--also-make):构建所列模块的依赖模块
2,-amd(--also-make-dependents):构建所列模块的依赖模块,构建依赖于依赖模块的其它 模块
3,-pl(--projects):构建指定的模块,模块间用逗号隔开
4, -rf(--resume-from):在完整的反应堆上,指定从哪个模块开始往后构建
使用maven构建web项目
web的archetype
org.apache.maven.archetypes:maven-archetype-webapp
版本管理
何为版本管理
org.apache.maven.archetypes:maven-archetype-webapp
0 条评论
下一页