赞
踩
之前对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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。