maven整体打包_Maven详细教程
前⾔
本⽂可以帮助你加深对Maven的整体认识,不是⼀篇基础⽂章。如果你现在还没有⽤ Maven 跑过 HelloWorld,那么本⽂可能不适合你。
⼀、Maven简介
Maven是⼀个项⽬管理⼯具,它包含了⼀个项⽬对象模型 (Project Object Model),⼀组标准集合,⼀个项⽬⽣命周期(Project Lifecycle),⼀个依赖管理系统(Dependency Management System),和⽤来运⾏定义在⽣命周期阶段(phase)中插件(plugin)⽬标(goal)的逻辑。
版本:maven有⾃⼰的版本定义和规则
构建:可以完成编译,打包,部署等。
依赖管理:⽅便引⼊所需依赖 Jar 包,不需⼿动下载
⽂档⽣成:maven的site命令⽀持各种⽂档信息的发布,包括构建过程的各种输出,javadoc,产品⽂档等。
项⽬关系:⼀个⼤型的项⽬通常有⼏个⼩项⽬或者模块组成,⽤maven可以很⽅便地管理
⼆、Maven⽣命周期
maven把项⽬的构建划分为不同的⽣命周期(lifecycle)。粗略⼀点的话,它这个过程(phase)包括:
验证(validate):验证项⽬是否正确
编译(compile): 编译项⽬的源代码
测试(test):使⽤合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署
打包(package)
验证(verify)
安装(install)
部署(deploy)
maven中所有的执⾏动作(goal)都需要指明⾃⼰在这个过程中的执⾏位置,然后maven执⾏的时候,就依照过程的发展依次调⽤这些goal 进⾏各种处理。
这个也是maven的⼀个基本调度机制。⼀般来说,位置稍后的过程都会依赖于之前的过程。当然,maven同样提供了配置⽂件,可以依照⽤户要求,跳过某些阶段。
三、Maven 版本规范
maven使⽤如下⼏个要素来唯⼀定位某⼀个输出物: groupId:artifactId:packaging:version 。⽐如org.springframework:spring:2.5。每个部分的解释如下:
groupId 公司,团体等。如Apache Software的项⽬有以org.apache开头的groupId。
artifactId 项⽬的唯⼀标识符。⽐如⼀个helloworld项⽬就叫helloworld。
packaging 项⽬打包输出的类型,默认是jar。类型为war的项⽬产⽣⼀个web应⽤。
version ⼀个项⽬的特定版本。发布的项⽬有⼀个固定的版本标识来指向该项⽬的某⼀个特定的版本。⽽正在开发中的项⽬可以⽤⼀个特殊的标识,这种标识给版本加上⼀个"SNAPSHOT"的标记。
maven有⾃⼰的版本规范,⼀般是如下定义..- ,⽐如1.2.3-beta-01。要说明的是,maven⾃⼰判断版本的算法是
major,minor,incremental部分⽤数字⽐较,qualifier部分⽤字符串⽐较,所以要⼩⼼ alpha-2和alpha-15的⽐较关系,最好⽤ alpha-02的格式。
maven在版本管理时候可以使⽤⼏个特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。⽐如"1.0-SNAPSHOT"。各个部分的含义和处理逻辑如下说明:
SNAPSHOT 如果⼀个版本包含字符串"SNAPSHOT",Maven就会在安装或发布这个组件的时候将该符号展开为⼀个⽇期和时间值,转换为UTC时间。例如,"1.0-SNAPSHOT"会在2010年5⽉5⽇下午2点10分发布时候变成1.0-20100505-141000-1。这个词只能⽤于开发过程中,因为⼀般来说,项⽬组都会频繁发布⼀些版本,最后实际发布的时候,会在这些snapshot版本中寻⼀个稳定的,⽤于正式发布,⽐如1.4版本发布之前,就会有⼀系列的1.4-SNAPSHOT,⽽实际发布的1.4,也是从中拿出来的⼀个稳定版。
LATEST 指某个特定构件的最新发布,这个发布可能是⼀个发布版,也可能是⼀个snapshot版,具体看哪个时间最后。
RELEASE 指最后⼀个发布版。
四、Maven 项⽬依赖
1. 多模块依赖和继承
项⽬结构图:
parent
├─childA(model层)
│ └─l(jar)
├─childB(web层)
│ └─l(war)
└─l(pom)
parent中执⾏mvn install就能将 childA和childB ⼀起编译
parent的l做如下配置:
com.song
parent
1.0-SNAPSHOT
pom
childA
childB
childA和childB的l都需要配置parent,防⽌引⼊的包冲突(如果不加parent,会分别去编译他们引⼊的依赖,会重复引⼊包):
parent
com.song
1.0-SNAPSHOT
4.0.0
childA
jar
parent
com.song
1.0-SNAPSHOT
4.0.0
childB
war
⼦pom间存在引⽤关系,⽐如childB引⽤到了childA的jar包
childA
1.0-SNAPSHOT
2. ⼦项⽬继承⽗项⽬的依赖
parent中加上,child项⽬就可以继承parent项⽬的依赖,并且在child中可以不⽤加version了。
javax.servlet
servlet-api
2.5
3. 依赖范围
如果不显⽰执⾏ 属性时,默认compile。
scope 属性包括:
compile(编译范围):编译范围的在所有的classpath中可⽤,同时它们也会被打包
provided(已提供范围):表⽰部署的环境当中有某容器已经提供了该jar包,只在编译classpath(不是运⾏时)可⽤。它们不是传递性的,也不会被打包。例如,如果你开发了⼀个web应⽤,你可能在编译classpath中需要可⽤的Servlet API来编译⼀个servlet,但是你不会想要在打包好的WAR中包含这个Se
rvlet API;这个Servlet API JAR由你的servlet容器(Tomcat)提供。
runtime(运⾏时范围):只在运⾏和测试系统的时候需要,但在编译的时候不需要。
test(测试范围):在⼀般的 编译和运⾏时都不需要,它们只有在测试编译和测试运⾏阶段可⽤。
system (系统范围):该范围不推荐使⽤(你应该⼀直尽量去从公共或定制的Maven仓库中引⽤依赖)
4. 可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)
maven的依赖关系是有传递性的。如:A-->B,B-->C。但有时候,项⽬A可能不是必需依赖C,因此需要在项⽬A中排除对A的依赖。在maven的依赖管理中,有两种⽅式可以对依赖关系进⾏,分别是可选依赖(Optional Dependencies)以及依赖排除(Dependency Exclusions)。
4.1 可选依赖 optional
当⼀个项⽬A依赖另⼀个项⽬B时,项⽬A可能很少⼀部分功能⽤到了项⽬B,此时就可以在A中配置对B的可选依赖。举例来说,⼀个类似hibernate的项⽬,它⽀持对mysql、oracle等各种数据库的⽀持,但是在引⽤这个项⽬时,我们可能只⽤到其对mysql的⽀持,此时就可以在这个项⽬中配置可选依赖。
配置可选依赖的原因:1、节约磁盘、内存等空间;2、避免license许可问题;3、避免类路径问题,等等。
sample.ProjectB
Project-B
1.0
compile
true
假设以上配置是项⽬A的配置,即:Project-A --> Project-B。在编译项⽬A时,是可以正常通过的。
如果有⼀个新的项⽬X依赖A,即:Project-X -> Project-A。此时项⽬X就不会依赖项⽬B了。如果项⽬X⽤到了涉及项⽬B的功能,那么就需要在l中重新配置对项⽬B的依赖。
4.2 依赖排除 exclusions
当⼀个项⽬A依赖项⽬B,⽽项⽬B同时依赖项⽬C,如果项⽬A中因为各种原因不想引⽤项⽬C,在配
置项⽬B的依赖时,可以排除对C的依赖。
⽰例(假设配置的是A的l,依赖关系为:A --> B; B --> C):
sample.ProjectB
Project-B
1.0
compile
sample.ProjectC
Project-C
当然,对于多重依赖,配置也很简单,参考如下⽰例:
Project-A
-> Project-B
-
> Project-D
-> Project-E
-> Project-F
-> Project C
A对于E相当于有多重依赖,我们在排除对E的依赖时,只需要在配置B的依赖中进⾏即可:
sample.ProjectB
Project-B
1.0-SNAPSHOT
sample.ProjectE
maven打包本地jar包Project-E
五、Maven插件机制
1. Maven默认插件
不配置Plugin时,Maven默认会使⽤以下插件。如果针对各个 plugin 有特殊配置的话,需要显⽰指定 plugin 和 属性配置。
plugin
function
life cycle phase
maven-clean-plugin
清理上⼀次执⾏创建的target⽂件
clean
maven-resources-plugin
处理资源⽂件
resources,testResources
maven-compiler-plugin
编译Java代码
compile、testCompile
maven-surefire-plugin
执⾏单元测试⽂件
test
maven-jar-plugin
创建 jar
package
maven-install-plugin
拷贝jar到本地的maven仓库 .m2/repository 下⾯install
maven-deploy-plugin
发布 jar
deploy
maven-site-plugin
⽣成⽂档
site
src/main/java
true
**/*.xml
src/main/resources
true
**/*.properties
*.xml
*.dic
*.txt
src/main/resources
false
*.p12
maven-compiler-plugin
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论