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