「每日分享」Maven实战

点击上方"java全栈技术"关注,每天学习一个java知识点

原创: Aisky

一、初识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

「每日分享」Maven实战

2、test 测试

「每日分享」Maven实战

3、provided:编译,不会打包

「每日分享」Maven实战

4 runtime:运行时有效

「每日分享」Maven实战

5、system :需要外在提供相应的元素,通过systemPath来取得 不建议使用新的版本这个元素有可能会被覆盖掉。本地jar包不在maven仓库中的,比如自己写的jar包其他项目想依赖怎么办:上传到私服,install到本地,add classpath

四、依赖原则

通过具体的列子解释,项目的结构图及依赖关系:

「每日分享」Maven实战


「每日分享」Maven实战


1>最短路径原则

考虑这种场景:

conan-web->conan-core->conan-common

查看conan-web的依赖关系:mvn dependency:tree>tree.txt

「每日分享」Maven实战


2>在conan-web pom.xml中添加common包查看依赖关系

「每日分享」Maven实战


「每日分享」Maven实战


这个时候可以看conan-web直接依赖于conan-common,而不是通过conan-core再依赖conna-web

3>加载顺序原则

conan-web pom.xml的配置如下:

「每日分享」Maven实战


假设conan-core依赖conan-common 的版本升级到了1.1,这个时候conan-web中依赖的conan-common的版本是多少呢?

根据下图可以看到是1.1的版本,这是因为conan-core在conan-web的pom.xml中配置的加载顺序要在conan-adaptor之前。

「每日分享」Maven实战


五、常用的插件

1、上面提及了修改版本号的问题,这里可以引入如下插件

「每日分享」Maven实战

执行:

mvn versions:set -DnewVersion=1.0-SNAPSHOT 这个命令子模块都会改变,如果担心子模块没有更新则执行:mvn versions:update-child-modules

回退版本号:mvn versions:revert

2、findbugs插件

「每日分享」Maven实战


「每日分享」Maven实战


运行mvn fingbugs:fingbugs 会看到findbugsXml.xml这里不好观察,可以用mvn fingbugs:gui

「每日分享」Maven实战


「每日分享」Maven实战


意思是list没有被使用,轻量级的静态bugs扫描可以选用findbugs,后续可以用sonar进行扫描;还有其他一些常用的tomcat插件,assembly插件就不一一列举的,提供如下查找plugin的地址

https://maven.apache.org/plugins/http://www.mojohaus.org/plugins.html

六、Maven打包

一般我们的项目都会有很多环境的配置文件比如dev、test、pro,我们在conan-web项目新增三个配置文件项

「每日分享」Maven实战


pom.xml配置

「每日分享」Maven实战


「每日分享」Maven实战


例如dev的:mvn package -P dev,查看target下配置文件为application-dev.properties验证成功

「每日分享」Maven实战


七、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会按绑定的时间被顺序执行。

「每日分享」Maven实战


八、版本管理

各个公司的版本命名规范可能不一致,常见的可能有:主版本号.次版本号.增量版本号-<里程碑版本>,比如1.0.0-RELAESE。

工作中经常看到这种场景:

假设conan-web目前依赖于一个api包版本为1.0-SNAPSHOT,后续某人对api包的接口变更了,比如某个接口多了个入参通知到你了,这个时候需要去更新最新的包,现在工作中很多人是直接把本地仓库的api包删除再重新拉取,这个效率就太低了,可以使用mvn clean package -U 强制去远端拉取一次

九、自定义插件

step1:新建maven项目

step2:修改packaging标签为:<packaging>maven-plugin</packaging>

step3:引入如下dependency

「每日分享」Maven实战

step4:新建一个mojo继承AbstractMojo

「每日分享」Maven实战

step5:运行拆建

在一个项目引入该插件并运行

「每日分享」Maven实战


「每日分享」Maven实战


「每日分享」Maven实战


这里xuanyuan:conan就叫一个goal,在目前的情况下除非单独运行这个插件在其他任何情况下都不会运行比如mvn install时候也不会运行,插件需要挂载到phase上才会运行

「每日分享」Maven实战


这个时候执行mvn compile该plugin是不会运行的,因为自定插件是LifecyclePhase.PACKAGE的,参考上面的生命周期图complie是在package之前install是在package之后的

我们可以看到打印的信息是conannull

「每日分享」Maven实战


如何传入msg信息,参考下图

「每日分享」Maven实战


「每日分享」Maven实战


传List

「每日分享」Maven实战


运行

「每日分享」Maven实战


十、搭建仓库

这里用的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

「每日分享」Maven实战


配置settings文件

「每日分享」Maven实战


「每日分享」Maven实战


把xuanyuan-plugin上传到仓库中,pom.xml添加

「每日分享」Maven实战

执行命令mvn delopy,验证

「每日分享」Maven实战


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:修改版本号


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值