之前对maven的学习不系统,只是知道简单的使用方法,工作之后才对maven有了更深的学习。接下来小白会利用空闲时间,系统的学习一下maven,并且记录一下maven的学习心得,和大家分享一下。由于本人能力有限,写的博客难免会出现问题。希望大家也希望各位大佬指出问题,共同进步。
这里记录的maven使用时的parent和dependencyManagement标签的作用和dependencyManagement于dependency标签的区别。
这里通过两个场景进行说明:
场景一,有两个web项目W1、W2,一个java项目J1,依赖同一个jar包:domain.jar。如果分别在各自pom文件中引入domain.jar的依赖,那么当domain.jar的版本发生变化时,三个项目的pom文件都要改,项目中依赖越多修改越多。
此时就可以使用parent标签, 可以创建一个parent项目,打包类型为pom,parent项目中没有任何代码,只是管理多个项目之间公共的依赖。在parent项目的pom文件中定义对domain.jar的依赖,W1W2J1三个子项目中只需要定义<parent></parent>,parent标签中写上parent项目的pom坐标就可以引用到domain.jar了。
场景二,有一个springweb.jar,只有W1W2两个web项目需要,J1项目是java项目不需要,那么又要怎么去依赖?
可以在W1和W2中分别定义对springweb.jar的依赖,当springweb.jar版本变化时修改起来不方便。
解决办法是在parent项目的pom文件中使用<dependencyManagement>即公共的依赖写在parent的<dependency>中,不是全部需要的依赖写在dependencyManagement中,当版本修改之后只需要修改parent的dependencyManagement中的版本就可以了,子项目只需要引用就好了。(前提是子项目不写版本号,否则以子项目的版本为主)
parent标签能够管理多个项目之间公共的依赖。通过字面意思我们很容易想到java中的继承,他和 java 中的继承相当,作用就是复用。例如场景一的例子。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>xxxxxx</artifactId>
<packaging>pom</packaging>
<version>1.0.1-SNAPSHOT</version>
<description>xxxxxxx</description>
<parent>
<groupId>xxxxxp</groupId>
<artifactId>ip-pomxxxx-parent</artifactId>
<version>2.0.6-RELEASE</version>
</parent>
<name>y-core-parent</name>
<modules>
<module>e-contract-common</module>
</modules>
<properties>
<contract.pub.version>1.0.2-SNAPSHOT</contract.pub.version>
</properties>
......
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.x x x.iuap</groupId>
<artifactId>x x x</artifactId>
<version>${cont.pub.version}</version>
</dependency>
<-- <properties>
<contract.pub.version>1.0.2-SNAPSHOT</contract.pub.version>
</properties>-->
</dependencyManagement>
<!--私服配置,用于发布-->
<distributionManagement>
<repository>
<id>ddds</id>
<name>Nexus Release Repository</name>
<url>http:maven仓库地址</url>
</repository>
</distributionManagement>
</project>
这个是项目的配置文件
<parent>
<groupId>xxxxxp</groupId>
<artifactId>iuap-pomxxxx-parent</artifactId>
<version>2.0.6-RC1-RELEASE</version>
</parent>
实现对依赖的版本统一控制,点进去我们会进入到该pom中,我们会发现该pom根据ucf-parent管理
<parent>
<groupId>com.xx.iuap</groupId>
<artifactId>ucf-parent</artifactId>
<version>2.0.1-RELEASE</version>
</parent>
再点进去会发现
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.11.RELEASE</version>
</parent>
<groupId>com.xx.iuap</groupId>
<artifactId>uc-parent</artifactId>
<version>2.0.1-RELEASE</version>
<name>uc-parent</name>
<packaging>pom</packaging>
即,会继承springboot的依赖包,整个依赖关系如下
- 注释: 目前 父->子的依赖关系为
org.springframework.boot: spring-boot-starter-parent
-> com.xx.iuap: iuap-3rd-party(公司外开源的)
-> com.xx.iuap: iuap-2nd-party(公司内部的依赖库)
-> com.yonyou.iuap: yonyou-mdd-starter-parent 一方包(工程中各个模块之间的依赖)
二方包的管理
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xx.up</groupId>
<artifactId>uc-parent</artifactId>
<version>2.0.1-RELEASE</version>
</parent>
<groupId>com.xx.iuap</groupId>
<artifactId>iuap-pom-with-ucf-parent</artifactId>
<version>2.0.6-RC1-RELEASE</version>
<name>iuap-pom-with-ucf-parent</name>
<packaging>pom</packaging>
<properties>
<!-- ucf组件 -->
<uc.version>2.0.0-RELEASE</ucf.version>
<uc.file.version>2.0.0-RELEASE</ucf.file.version>
<uc.log.version>1.0.9-RELEASE</ucf.log.version>
<uc.ds.version>2.0.0-RELEASE</ucf.ds.version>
<!-- iuap组件 -->
<ap.version>5.0.4-RELEASE</iuap.version>
<irs.version>5.2.8-RELEASE</iris.version>
<mwclient.version>5.2.8-RELEASE</mwclient.version>
<eos-spring-support.version>5.2.8-RELEASE</eos-spring-support.version>
<auth.sdk.version>6.0.2-RELEASE</auth.sdk.version>
<auth.sdk.core.version>3.5.2-RELEASE</auth.sdk.core.version>
<open.isv.version>1.0.0-RELEASE</open.isv.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.xx.iuap</groupId>
<artifactId>iuap-pom</artifactId>
<version>2.0.6-RC1-RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<distributionManagement>
<repository>
<id>iUAP</id>
<name>iUAP</name>
<url>http://maven.yonyou.com/nexus/content/repositories/iUAP/</url>
</repository>
</distributionManagement>
</project>
三方包的管理
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.11.RELEASE</version>
</parent>
<groupId>com.yonyou.iuap</groupId>
<artifactId>ucf-parent</artifactId>
<version>2.0.1-RELEASE</version>
<name>ucf-parent</name>
<packaging>pom</packaging>
<properties>
<HikariCP.version>3.3.1</HikariCP.version>
<activation.version>1.1.1</activation.version>
<activiti.version>5.22.0</activiti.version>
<activemq-spring.version>5.16.0</activemq-spring.version>
<alipay-sdk.version>4.10.70.ALL</alipay-sdk.version>
<amqp-client.version>5.4.3</amqp-client.version>
<antisamy.version>1.5.7</antisamy.version>
<apache-lucene.version>3.0.1</apache-lucene.version>
<junit-repeat-rule.version>3.0.1</junit-repeat-rule.version>
......
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>${cglib.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>com.github.cbismuth</groupId>
<artifactId>junit-repeat-rule</artifactId>
<version>${junit-repeat-rule.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>${apache-lucene.version}</version>
</dependency>
......
</dependencies>
</dependencyManagement>
<!-- 插件管理配置 -->
<build>
<plugins>
<!-- 定义JDK版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</build>
<distributionManagement>
<repository>
<id>iUAP</id>
<name>iUAP</name>
<url>http://maven.xxx.com/nexus/content/repositories/iUAP/</url>
</repository>
</distributionManagement>
</project>
使用dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,不用每个模块项目都弄一个版本号,不利于管理,当需要变更版本号的时候只需要在父类容器里更新,不需要任何一个子项目的修改;
如果某个子项目需要另外一个特殊的版本号时,只需要在自己的模块dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。如果不声明版本号的话,会使用父类的版本号。
(1)Dependencies相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
(2)dependencyManagement里只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖。
1)如果不在子项目中声明依赖,是不会从父项目中继承下来的;
2)只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并。 且version和scope都读取自父pom;
3)另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
具体的使用区别可以查看之前的场景2