Mava 知识总结

我把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标签为:<packaging>maven-plugin</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实战》

作者:挨踢男孩

链接:https://www.jianshu.com/p/689d0d3cc526

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 223,689评论 6 521
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,685评论 3 401
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 170,676评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,496评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,512评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,044评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,423评论 3 427
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,399评论 0 278
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,923评论 1 323
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,973评论 3 343
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,117评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,761评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,440评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,929评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,045评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,609评论 3 380
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,147评论 2 363