maven坐标
Maven一大功能之管理项目依赖的基础就是坐标,为了能够自动化的解析每一个java构建,Maven就必须将他们唯一标示。
一组Maven坐标由以下几个元素定义的:
- groupId
- artifactId
- version
- packaging
- classifier
如:
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7</version>
<packaging>jar</packaging>
gorupId
定义当前Maven项目隶属的实际项目。springframework为一实际项目,下面有很多Maven项目,如spring-core、spring-context等。
命名与java包名类似,域名反向加实际项目名
artifactId
定义实际项目的一个Maven项目(模块),Maven项目的唯一Id。推荐的写法是用实际项目作为artifactId的前缀,不然每个项目都有一个core模块就很难区分。
version
定义Maven项目当前的版本。下面再补充Maven的版本规范,以及快照(SNAPSHOT)。
packaging
定义Maven项目的打包方式。打包方式通常与所生成构件的文件拓展名对应(不一定)。如上packaging为jar,最后生成的文件名为spring-core-4.3.7.jar。以war命名的生成一个.war文件。当不定义packaging的时候,默认为jar。
对于聚合模块跟父模块的packaging必须为pom,否则项目无法构建。
classifier
帮助定义构建输出的一些附属构件。注意,不能直接定义项目的classifier,因为附属构件不是项目直接默认生成的,而是由附加的插架帮助生成。
maven依赖
- 依赖配置如下:
<dependencies>
<dependency>
<groupId>com.soft.zsmart.bss.cvbs</groupId>
<artifactId>cvbs-bom</artifactId>
<version>9.0.0</version>
<type>pom</type>
<scope>import</scope>
<optional>...<optional>
<exclusions>
<exclusion>
...
</exclusion>
</exclusions>
...
</dependency>
</dependencies>
其中groupId、artifactId、version定义了依赖Maven项目的坐标,下面解释下其他元素的作用。
- type 依赖的类型,对应项目坐标定义的packaging
- scope 依赖的范围。
- optional 标记依赖是否可选
- exclusions 用来排除传递性依赖
- 依赖范围
依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,依赖类型有以下几种:
- compile 编译依赖范围(默认依赖范围),三种classpath都有效
- test 测试依赖范围。只对测试classpath有效
- provided 已提供依赖范围。编译、测试有效。
- runtime 运行时依赖范围。运行、测试有效。
- system 系统依赖范围。与provided一样,编译、测试有效,但要通过systemPath显示指定依赖文件路径。
- import 导入依赖范围。
SHNPSHOT(快照)
项目处于开发中,属于不稳定的版本。解决项目开发中,多模块依赖的问题。如2.0-SHNPSHOT,加上SHNPSHOT后,发布到私服中,在发布的过程中Maven会自动为构件打上时间戳,如2.0-20180324.221414-12表示2018年3月24日22点14分14秒的第12次快照。
有了时间戳,Maven就能随时找到仓库中该构件版本的最新文件。可以用-U强制让Maven检查更新 mvn clean install -U
Maven生命周期
Maven的生命周期就是为了对所有的构建过程进行抽象和统一。包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成。
Maven三套生命周期:
- clean 清理项目
- default 构建项目
- site 建立项目站点
插件和插件目标
Maven的核心仅仅定义了抽象的生命周期,具体的任务是由插件来完成的,插件以独立的构件形式存在。
对于插件本身,为了代码复用,它有很多的任务,如maven-dependency-plugin有十多个目标,每个目标对应一个功能,所以就有个插件目标的概念。如compiler:compiler(这是maven-compiler-plugin的compiler目标)和surefire:test(maven-surefire-plugin的test目标)。
聚合和继承
聚合(又称多模块)主要是为了方便我们构建多模块Maven项目,通过聚合的方式将多个模块的maven项目聚合到一个项目下,通过该项目构建整个项目的所有模块。
聚合模块pom定义:
<groupId>com.soft.zsmart.bss.cvbs</groupId>
<artifactId>cvbs-parent</artifactId>
<version>9.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>cvBS Parent</name>
<modules>
<module>cvbs-order</module>
<module>cvbs-account</module>
<module>cvbs-offer</module>
<module>cvbs-customer</module>
<module>cvbs-resource</module>
<module>cvbs-contact</module>
<module>cvbs-price</module>
<module>cvbs-fee</module>
<module>cvbs-payment-impl</module>
<module>business-framework</module>
</modules>
继承:解决多个模块的pom文件有许多相同的配置,抽取出重复的配置,这就是pom的继承。
子模块通过parent继承父模块:
<parent>
<groupId>com.ztesoft.zsmart.bss.cvbs</groupId>
<artifactId>cvbs-parent</artifactId>
<version>9.0.0-SNAPSHOT</version>
</parent>
实际项目中,为了方便,可以将一个pom即作为聚合pom,有作为父pom。
网友评论