我们项目中有个技术小组一直在做技术分享,近期有哥们分享工程化专题中的git部分,我把Maven整理了下进行分享。
一、初识Maven
Maven是Apache组织中的一个很成功的开源项目,Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。
优点:
1> 简单
2> 持续集成CI
3> 构建简单
4> 插件丰富
5> 约定优于配置
二、下载安装
下载:官网http://maven.apache.org/ 下载即可
安装:将下载好的包解压、配置环境变量即可
Maven加载配置文件的优先级:用户目录/.m2/settings->自己安装的Maven下的config/settings.xml
三、pom.xml常用节点的含义
modelVersion:找到你安装maven的路径:org/apache/maven/model下的pom,超级pom的version版本
groupId:一般配置的是公司域名
artifactId:这个项目的功能
version:version的定义是很讲究的,后续会影响合测试人员的沟通成本、效率
packaging:打包的方式,默认是打成jar包
name:项目展示的名称
description:对该项目的描述
parent:parent pom
properties:定义parent pom中的变量
exclusions:一般是为了解决jar包冲突的问题
dependencyManagement:一般只会出现在父pom中、统一版本号,声明式;在其中管理的jar包,其他module直接引用即可无需添加版本号
dependency:其中的scope的含义与案例
1、compile编译:默认不写就是scope
2、test 测试
3、provided:编译,不会打包
4 runtime:运行时有效
5、system :需要外在提供相应的元素,通过systemPath来取得 不建议使用新的版本这个元素有可能会被覆盖掉。本地jar包不在maven仓库中的,比如自己写的jar包其他项目想依赖怎么办:上传到私服,install到本地,add classpath
四、依赖原则
通过具体的列子解释,项目的结构图及依赖关系:
1>最短路径原则
考虑这种场景:
conan-web->conan-core->conan-common
查看conan-web的依赖关系:mvn dependency:tree>tree.txt
2>在conan-web pom.xml中添加common包查看依赖关系
这个时候可以看conan-web直接依赖于conan-common,而不是通过conan-core再依赖conna-web
2>加载顺序原则
conan-web pom.xml的配置如下:
假设conan-core依赖conan-common 的版本升级到了1.1,这个时候conan-web中依赖的conan-common的版本是多少呢?
根据下图可以看到是1.1的版本,这是因为conan-core在conan-web的pom.xml中配置的加载顺序要在conan-adaptor之前。
五、常用的插件
1、上面提及了修改版本号的问题,这里可以引入如下插件
执行:
mvn versions:set -DnewVersion=1.0-SNAPSHOT 这个命令子模块都会改变,如果担心子模块没有更新则执行:mvn versions:update-child-modules
回退版本号:mvn versions:revert
2、findbugs插件
运行mvn fingbugs:fingbugs 会看到findbugsXml.xml这里不好观察,可以用mvn fingbugs:gui
意思是list没有被使用,轻量级的静态bugs扫描可以选用findbugs,后续可以用sonar进行扫描;还有其他一些常用的tomcat插件,assembly插件就不一一列举的,提供如下查找plugin的地址
https://maven.apache.org/plugins/
http://www.mojohaus.org/plugins.html
六、Maven打包
一般我们的项目都会有很多环境的配置文件比如dev、test、pro,我们在conan-web项目新增三个配置文件项
pom.xml配置
例如dev的:mvn package -P dev,查看target下配置文件为application-dev.properties验证成功
七、LifeCycle、Phase、Goal的区别
三者的区别可以用下面两句话概括:
A Build Lifecycle is Made Up of Phases
A Build Phase is Made Up of Plugin Goals
一个生命周期包含多个阶段,一个阶段中可以由多个goal组成。
Maven把项目的构建划分为不同的生命周期,常见的生命周期有下图的:clean Lifecycle,Default Lifecycle ,Site Lifecyle,比如Clean Lifecycle中的clean就是一个phase,phase是按顺序执行的。
goals:执行任务的最小单元,它可以绑定到任意个phase中,一个phase有一个或多个goal,goal也是按顺序执行的,一个phase被执行时,绑定到phase里的goal会按绑定的时间被顺序执行。
八、版本管理
各个公司的版本命名规范可能不一致,常见的可能有:主版本号.次版本号.增量版本号-<里程碑版本>,比如1.0.0-RELAESE。
工作中经常看到这种场景:
假设conan-web目前依赖于一个api包版本为1.0-SNAPSHOT,后续某人对api包的接口变更了,比如某个接口多了个入参通知到你了,这个时候需要去更新最新的包,现在工作中很多人是直接把本地仓库的api包删除再重新拉取,这个效率就太低了,可以使用mvn clean package -U 强制去远端拉取一次
九、自定义插件
step1:新建maven项目
step2:修改packaging标签为:
step3:引入如下dependency
step4:新建一个mojo继承AbstractMojo
/**
* Created by aisky on 2018/8/7.
*@Mojo定义插件的相关信息
*/
@Mojo(name="conan",defaultPhase = LifecyclePhase.PACKAGE)
public class XyMojo extends AbstractMojo{
@Parameter
private String msg;
@Parameter
privateList options;
public void execute() throws MojoExecutionException, MojoFailureException{
System.out.println("conan"+msg);
System.out.println("conan "+options);
}
}
step5:运行插件
在一个项目引入该插件并运行
这里xuanyuan:conan就叫一个goal,在目前的情况下除非单独运行这个插件在其他任何情况下都不会运行比如mvn install时候也不会运行,插件需要挂载到phase上才会运行
这个时候执行mvn compile该plugin是不会运行的,因为自定插件是LifecyclePhase.PACKAGE的,参考上面的生命周期图complie是在package之前install是在package之后的
我们可以看到打印的信息是conannull
如何传入msg信息,参考下图
传List
运行
十、搭建仓库
这里用的nexus-2.11.2-03-bundle.tar.gz的包
wget https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.11.2-03-bundle.tar.gz
下载解压安装就行了,不能用root用户起,在/ect/profile加上export RUN_AS_USER=root,默认端口号是8081,用户名/密码:admin/admin123
配置settings文件
把xuanyuan-plugin上传到仓库中,pom.xml添加
执行命令mvn delopy,验证
11、总结
大家想深入学习Maven的话可以看看《Maven实战》这本书,最后列出常用的Maven命令
compile:编译
clean:把项目下的target删除
test:运行项目中的test case
package:打包默认jar
install: 把项目install到本地仓库
deploy:把本地的jar包发布到私服上
mvn dependency:tree:查看依赖关系,可以解决日常很多问题了,比如 class not found这种问题
mvn clean package -U:强制去远端拉取最新的jar包
mvn versions:set -DnewVersion=xxx:修改版本号
参考文章
许晓斌《Maven实战》
欢迎关注微信公众号获取更多学习资源