MAVEN总结

最初用maven 的最大好处,可以自动打包,自动构建,可以帮我们管理jar包,不用同之前一样手动去找到jar包,copy进去,
但是用着用着发现,maven大多数依赖中都会封装了其他依赖,在一个复杂的项目中,会出现各种依赖冲突。
那么怎么解决这些依赖冲突呢,怎么在多moudle中只添加需要导入父pom中的依赖呢?
先了解下maven构建
将.java .jsp ,第三方jar包,各种配置文件等进行编译,部署,最终变成一个 我们可以直接运行的项目。

构建工程
1.clean:清除之前编译的文件例如.class文件(直接将target文件夹删除 编译的文件,打的包,都存放在target下)
2.compile:将.java,.jsp等文件编译为.class文件,将配置文件按照规定格进行编译。
3.test:这里指的是自动测试(不是junit那种),eg.当我们编译后,确保某些代码正确,就由maven代替我们自动测试,是否正确
4.报告:这里据说是 test之后生产的测试报告。
5.package:将一个工程下的多个文件,打成一个包,普通java工程 jar包,web 工程 war包。便于安装或部署
6.install:将打好的包 下载到本地仓库,这样可以被其他工程引用
7.deploy:将web工程 打成的war包 发到指定的servlet目录下 使其可以运行。

①target编译结构
classes就是正常编译的
test-classes 就是测试的.class文件
下面的Jar包 就是package是生成的
clean 就是把target清空了


编译目录结构

②坐标
相当于一个标识 可以找到对应的位置

<groupId>mysql</groupId> //公司名称
<artifactId>mysql-connector-java</artifactId> //项目名称
<version>5.1.36</version> //版本号
意思是mysql 公司 mysql-connector-java这个项目 版本为5.1.36

③仓库
仓库主要分为本地仓库和远程仓库
本地:我们当前电脑中的仓库
远程:私有仓库和中央仓库
maven获取jar包,war包等流程图。


流程

④依赖
dependency 根据坐标去找,流程如上图。
若我们自己的包,package之后 要install 下载的本地仓库,不然找不到
4.1依赖范围
大体有4个条件决定
1.对主程序是否有效
2.对测试程序是否有效
3.是否参与打包
4.是否参与部署


常见3个 compile test provided
对主程序是否有效
对测试程序是否有效
是否参与打包
是否参与部署
例子 junit servlet-api

provided适用于 在本机上运行测试都可以,当要部署到服务器上时,例如tomcat,本机编译测试时,要有servlet-api.jar,而部署服务器上有servlet-api相关环境,就不需要打包部署了。

⑤生命周期
构建时的执行过程和顺序。
maven是由插件来完成打包,编译等操作。
他是按照某一特定的执行顺序来进行。
例如compile:



package:
可以看到他都是有特定的顺序 先compile 在testResources 一步一步来是一个组合的过程(执行这一操作,包含前面其他操作)


⑥依赖(高级)
6.1依赖的传递性


image.png

可以看到我们要导入spring-test这个jar时 spring-test 依赖spring-core,spring-core依赖spring-jcl。所以都会导入进来。
好处:我们只需要在 最"下"层的module加 不必每个moudle都加
PS:只有compile范围的依赖才可以传递,所以别的module如果需要,需手动添加(一般这些比较少,不会出现过多冗余)
6.2依赖的排除
假设某个jar包不稳定或者冲突时,我们需要排除这个jar


image.png

eg.我们排除画X的依赖

6.3依赖原则

(1)路径最短优先选择
假如有3个moudle A-->B-->C
B有log4j.1.2.1
C有log4j.1.2.4
根据依赖的传递性A也会有log4j 但是版本是哪个呢 B,因为B路径最短。(当然我们也可以手动申明需要哪个版本)
(2)路径相同时 先申明者优先
如果3个moduleA--B,C
B有log4j.1.2.1
C有log4j.1.2.4
A同时依赖两个
同样根据依赖的传递性A也会有log4j
此时看A的pom中 他先应用哪个moudle的依赖就用谁的版本(当然我们也可以手动申明需要哪个版本)
6.4统一管理所需的jar包的版本
当我们各个module中jar包版本不一致,容易冲突,所以我们用properties标签管理起来,这样即解决了冲突,又方便了修改(这里适用于多个moudle,最后借助一个父module 全部依赖放到父pom.xml 后面会讲到)


image.png

6.5继承
例如junit scope为test 根据依赖的传递性,test不能被传递,所以其他moudle就可能出现版本不一致问题,团队协同开发不方便。
所以用一个父pom管理 打包方式为pom
子pom.xml 中配置如下图,这样子module就会去找到父模块中<dependencyManagement>的标签去引用他的版本号
PS:<dependencyManagement>中定义的只是依赖的声明,并不实现引入,子项目中申明时才会引入
 <parent>
        <artifactId>cloud-project</artifactId>
        <groupId>com.example</groupId>
        <version>1.0-SNAPSHOT</version>
<!-- 以当前工程所在位置去找 父工程的pom.xml 相对路径-->
        <relativePath>../pom.xml</relativePath>
 </parent>

子moudle无需指定版本号

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

6.6聚合
在多module中 moduleA依赖moudleB ,moudleB依赖moudleC
如果我们PackageA 时 必须先B ok ,B必须C ok,所以我们需要手动去按C,B最后在A,按顺序来。ps:继承中也要先install parent moudle
而添加了 如下<Modules>标签以后,maven会自动帮我门找到依赖关系,自动安装

<modules>
//module里写相对路径,(在父moudle下建立的子module也可以通过moudle名找到)
        <module>eureka-server7001</module>  
        <module>common-api</module>
</modules>

pom打包是什么意思?
pom打包不同与jar,war包 对于编译后具体的资源进行打包,
他只在父级工程或聚合工程中 作为jar包的版本控制,作为其他项目的依赖

package,install,deploy区别
package 进行了项目编译,单测,打包。
install 进行了项目编译,单测,打包,并且把包下载到了本地仓库。
deploy 进行了项目编译,单测,打包,并且把包下载到了本地仓库和私有仓库。

参考:
MAVEN视频
package,install,deploy 3者区别

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