Maven实战
2017-07-25 23:25:42 272 举报
AI智能生成
《maven实战》这本书的思维导图
作者其他创作
大纲/内容
Maven In Action
什么是Maven
Maven主要是基于Java平台的项目构建、依赖管理和项目信息管理
Build-每天有很多的时间花在了编译、运行单元测试。生成文档,打包和部署等繁琐且不起眼的工作上,这个就是构建
Maven可以帮助我们自动化构建过程,从清理、编译、测试到生成报告,再到打包部署
Maven的安装和配置
安装Maven
安装目录分析
bin:包含了运行的脚本文件,包括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坐标
包含groupId、artifactId、version、packaging、classifier
坐标详解
packaging:有jar、war等。缺省值为:jar
classifier: 定义一些附属构建,不能直接定义项目的classifier,是由附加的插件帮助生成的
依赖的配置
<dependencies>下<dependency>标签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:导入依赖范围。
传递性依赖
------------------------------------------------------------ compile test provided runtime ------------------------------------------------------------compile compile —— —— runtime test test —— —— testprovided provided —— provided providedruntime runtime —— —— runtime
依赖调节
依赖调节第一原则:路径最近者优先依赖调节第二原则:第一声明者优先(也就是在POM先定义的先依赖)
可选依赖
最佳实践
排除依赖:<exclusions>下的<exclusion>标签
归类依赖:<properties>中定义一个元素test,以后需要的地方直接引用${test}
优化依赖:mvn dependency:list 查看当前项目已解析依赖 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)
在settings.xml文件中添加<server>...</servers>中的<id></id>会和Pom中的仓库对应
部署artifact至远程仓库:<distributionManagement>...</distributionManagement>部署artifact命令:mvn clean deploy
快照版本:snapshot,maven会自动加上版本号当有依赖时,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名字并使用
镜像
在settings配置文件中添加<mirror>...</mirror><mirrorOf>id</mirrorOf>表示仓库劫持,任何对id仓库的访问都会劫持到镜像仓库中去
生命周期和插件
何为生命周期
maven的生命周期:清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成
maven的生命周期本身不做任何工作,实际工作(如编译)是由插件来完成的
生命周期详解
maven有三套生命周期,clean:清理项目、default:构建项目、site:建立项目站点
每个生命周期包含一些phase(阶段),后面的phase依赖于前面的phase
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复制到远程仓库,供其他项目使用
site生命周期:建立和发布项目站点 pre-site: site:生成项目站点文档 post-site: site-deploy:将生成的项目站点发布到服务器上
插件目标
多个功能聚集在一个插件里,每个功能对应一个插件的目标:ie. dependency:anlyze--->分析项目依赖 dependency:tree--->画出项目的依赖树 dependency:list--->列出项目的依赖
插件绑定
生命周期的phase与plugin 的goal绑定在一起完成工作,ie,default的compile与maven-compiler-plugin:compile目标绑定在一起
内置的绑定: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
内置的绑定: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
自定义绑定:<bulid> <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>
POM中插件任务配置:当configuration放在<execution>下时,表示这个是特定任务 <execution> <configuration> </configuration> </execution>
获取插件信息
在线插件信息
使用maven-help-plugin 描述插件:mvn help:describe
从命令行调用插件
mvn dependency:tree之所以可以使用dependency代替groupId:artifactId:version,是因为后者artifactId的前缀的值是前者
插件解析机制
插件仓库:<pluginRepositories> <pluginRepository> </pluginRepository></pluginRepositories>
插件的默认groupId:若插件为Maven的官方插件,则在POM配置中可以省略groupId的值org.apache.maven.plugins
解析插件版本:1,在super POM中设定了核心插件的版本,当用户使用核心插件时,不指定版本,就会使用 super POM中的版本2,若使用了非核心插件,且没有指定版本,则会检查所有插件仓库中的版本,解析到最新的 release版本(maven2 会解析至latest,maven3 会解析至release)
解析插件前缀:1,会查询groupId/maven-metadata.xml2,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项目即可以是父子关系,也可以是平行关系,只需要<module>相对路径配置正确即可
继承
可以将子模块中公共的部分提取出来,放到父模块中。
父模块的打包方式为pom,子模块的pom中需要继承父模块的pom<parent> <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <relativePath>../account-parent/pom.xml(相对路径)</relativePath> </parent>
可以继承的pom元素:groupId:项目组IDversion:项目的版本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>
插件管理:pluginManagement元素集中管理插件,xml配置文件信息如上
聚合与继承的关系: 聚合:聚合模块知道哪些被聚合的模块,但被聚合的模块不知道聚合模块的存在 继承:父POM不知道子模块,但子模块都知道父POM的存在可以将聚合和继承的代码都放到同一个pom文件中
约定优于配置:
反应堆的构建顺序: 1,maven按顺序读取pom,如果该pom没有依赖模块,那么就构建该模块 2,否则就先构建其依赖的模块 3,如果该依赖还依赖其它的模块,则进一步先构建依赖的依赖
使用maven构建web项目
web的archetype
org.apache.maven.archetypes:maven-archetype-webapp
版本管理
何为版本管理
0 条评论
回复 删除
下一页