浅谈Maven——管理jar包
Maven
什么是Maven
Maven是Apache的⼀款开源的项⽬管理⼯具,基于ANT的升级,是全新的⾃动化构建⼯具。
Maven使⽤项⽬对象模型(POM-Project Object Model,项⽬对象模型)的概念,可以通过⼀⼩段描述信息来管理项⽬的构建,报告和⽂档的软件项⽬管理⼯具。在Maven中每个项⽬都相当于是⼀个对象,对象(项⽬)和对象(项⽬)之间是有关系的。关系包含了:依赖、继承、聚合,实现Maven项⽬可以更加⽅便的实现导jar包、拆分项⽬等效果。
Maven仓库
远程仓库
本地仓库
本地仓库指本机的⼀份拷贝,⽤来缓存远程下载,包含你尚未发布的临时构件。
仓库的配置
本地仓库是开发者本地电脑中的⼀个⽬录,⽤于缓存从远程仓库下载的构件。默认的本地仓库是${user.home}/.m2/repository。⽤户可使⽤l⽂件修改本地仓库。具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="/SETTINGS/1.0.0"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/SETTINGS/1.0.0 /xsd/settings-1.0.0.xsd">
<!-- 本地仓库配置 -->
<localRepository>具体本地仓库位置</localRepository>
</settings>
当然,如果不配置l的话,我们的IDEA也会⾃动帮我们配置本地仓库的路径信息,截图如下:
<mirror>
<!-- 指定镜像ID(可⾃⼰改名) -->
<id>nexus-aliyun</id>
<!-- 匹配中央仓库(阿⾥云的仓库名称,不可以⾃⼰起名,必须这么写)-->
<mirrorOf>central</mirrorOf>
<!-- 指定镜像名称(可⾃⼰改名) -->
<name>Nexus aliyun</name>
<!-- 指定镜像路径(镜像地址) -->
<url>maven.aliyun/nexus/content/groups/public</url>
</mirror>
仓库优先级问题
Maven⼯程类型
【1】POM⼯程
POM⼯程是逻辑⼯程。⽤在⽗级⼯程或聚合⼯程中。⽤来做jar包的版本控制。
【2】JAR⼯程
将会打包成jar,⽤作jar包使⽤。即常见的本地⼯程 —> Java Project。
【3】WAR⼯程
将会打包成war,发布在服务器上的⼯程。
POM模式-Maven⼯程关系
Maven⼯具基于POM(Project Object Model,项⽬对象模型)模式实现的。在Maven中每个项⽬都相当于是⼀个对象,对象(项⽬)和对象(项⽬)之间是有关系的。关系包含了:依赖、继承、聚合,实现Maven项⽬可以更加⽅便的实现导jar包、拆分项⽬等效果。
依赖
特性_依赖的传递性
传递性依赖是Maven2.0的新特性。假设你的项⽬依赖于⼀个库,⽽这个库⼜依赖于其他库。你不必⾃⼰去出所有这些依赖,你只需要加上你直接依赖的库,Maven会隐式的把这些库间接依赖的库也加⼊到你的项⽬中。这个特性是靠解析从远程仓库中获取的依赖库的项⽬⽂件实现的。⼀般的,这些项⽬的所有依赖都会加⼊到项⽬中,或者从⽗项⽬继承,或者通过传递性依赖。
如果A依赖了B,那么C依赖A时会⾃动把A和B都导⼊进来。
原则_两个原则
【1】第⼀原则:最短路径优先原则
“最短路径优先”意味着项⽬依赖关系树中路径最短的版本会被使⽤。
例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0) 和A->E->(D1.0),那么D(1.0)会被使⽤,因为A通过E到D的路径更短。
【2】第⼆原则:最先声明原则
依赖路径长度是⼀样的的时候,第⼀原则不能解决所有问题,⽐如这样的依赖关系:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是⼀样的,都为2。那么到底谁会被解析使⽤呢?在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第⼆原则:第⼀声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使⽤。顺序最靠前的那个依赖优胜。
排除依赖
exclusions: ⽤来排除传递性依赖 其中可配置多个exclusion标签,每个exclusion标签⾥⾯对应的有groupId, artifactId, version三项基本元素。注意:不⽤写版本号。
依赖范围
compile
这是默认范围。如果没有指定,就会使⽤该依赖范围。表⽰该依赖在编译和运⾏时都⽣效。
provided
已提供依赖范围。使⽤此依赖范围的Maven依赖。典型的例⼦是servlet-api,编译和测试项⽬的时候需
要该依赖,但在运⾏项⽬的时候,由于容器已经提供,就不需要Maven重复地引⼊⼀遍(如:servlet-api)
runtime范围表明编译时不需要⽣效,⽽只在运⾏时⽣效。典型的例⼦是JDBC驱动实现,项⽬主代码的编译只需要JDK提供的JDBC接⼝,只有在执⾏测试或者运⾏项⽬的时候才需要实现上述接⼝的具体JDBC驱动。
system
系统范围与provided类似,不过你必须显式指定⼀个本地系统路径的JAR,此类依赖应该⼀直有效,Maven也不会去仓库中寻它。
但是,使⽤system范围依赖时必须通过systemPath元素显式地指定依赖⽂件的路径。
test
test范围表明使⽤此依赖范围的依赖,只在编译测试代码和运⾏测试的时候需要,应⽤的正常运⾏不需要此类依赖。典型的例⼦就是JUnit,它只有在编译测试代码及运⾏测试的时候才需要。Junit的jar包就在测试阶段⽤就⾏了,你导出项⽬的时候没有必要把junit的东西到处去了就,所在在junit坐标下加⼊scope-test
Import
import范围只适⽤于pom⽂件中的部分。表明指定的POM必须使⽤部分的依赖。
注意:import只能⽤在dependencyManagement的scope⾥。
继承
如果A⼯程继承B⼯程,则代表A⼯程默认依赖B⼯程依赖的所有资源,且可以应⽤B⼯程中定义的所有资源信息。
被继承的⼯程(B⼯程)只能是POM⼯程。
注意:在⽗项⽬中放在中的内容时不被⼦项⽬继承,不可以直接使⽤。
放在中的内容主要⽬的是进⾏版本管理。⾥⾯的内容在⼦项⽬中依赖时坐标只需要填写和即可。(注意:如果⼦项⽬不希望使⽤⽗项⽬的版本,可以明确配置version)。
聚合
当我们开发的⼯程拥有2个以上模块的时候,每个模块都是⼀个独⽴的功能集合。⽐如某⼤学系统中拥
有搜索平台,学习平台,考试平台等。开发的时候每个平台都可以独⽴编译,测试,运⾏。这个时候我们就需要⼀个聚合⼯程。
在创建聚合⼯程的过程中,总的⼯程必须是⼀个POM⼯程(Maven Project)(聚合项⽬必须是⼀个pom类型的项⽬,jar项⽬war项⽬是没有办法做聚合⼯程的),各⼦模块可以是任意类型模块(Maven Module)。
前提:继承。
聚合包含了继承的特性。
聚合时多个项⽬的本质还是⼀个项⽬。这些项⽬被⼀个⼤的⽗项⽬包含。且这时⽗项⽬类型为pom类型。同时在⽗项⽬的l中出现表⽰包含的所有⼦模块。
总项⽬:⼀般总项⽬:POM项⽬
Maven常见命令介绍
install
本地安装, 包含编译,打包,安装到本地仓库
编译 - javac
打包 - jar, 将java代码打包为jar⽂件
安装到本地仓库 - 将打包的jar⽂件,保存到本地仓库⽬录中
clean
清除已编译信息
删除⼯程中的target⽬录
compile
只编译 javac命令
package
打包。 包含编译,打包两个功能。
ant安装包install和package的区别:
package命令完成了项⽬编译、单元测试、打包功能,但没有把打好的可执⾏jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。
install命令完成了项⽬编译、单元测试、打包功能,同时把打好的可执⾏jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论