ToB企服应用市场:ToB评测及商务社交产业平台

标题: Maven依赖管理 [打印本页]

作者: 王國慶    时间: 2024-1-18 02:56
标题: Maven依赖管理
1.  依赖管理
依赖管理,可以将有关依赖项的所有信息放在共同的POM中,并对子POM中的工件进行更简单的引用。举个例子:
父POM
  1. <project>
  2.     ......
  3.     <dependencyManagement>
  4.         <dependencies>
  5.             <dependency>
  6.                 <groupId>group-a</groupId>
  7.                 <artifactId>artifact-a</artifactId>
  8.                 <version>1.0</version>
  9.                 <exclusions>
  10.                     <exclusion>
  11.                         <groupId>group-c</groupId>
  12.                         <artifactId>excluded-artifact</artifactId>
  13.                     </exclusion>
  14.                 </exclusions>
  15.             </dependency>
  16.             <dependency>
  17.                 <groupId>group-c</groupId>
  18.                 <artifactId>artifact-b</artifactId>
  19.                 <version>1.0</version>
  20.                 <type>war</type>
  21.                 <scope>runtime</scope>
  22.             </dependency>
  23.             <dependency>
  24.                 <groupId>group-a</groupId>
  25.                 <artifactId>artifact-b</artifactId>
  26.                 <version>1.0</version>
  27.                 <type>bar</type>
  28.                 <scope>runtime</scope>
  29.             </dependency>
  30.         </dependencies>
  31.     </dependencyManagement>
  32.     ......
  33. </project>
复制代码
两个子POM
  1. <project>
  2.     ...
  3.     <dependencies>
  4.         <dependency>
  5.             <groupId>group-a</groupId>
  6.             <artifactId>artifact-a</artifactId>
  7.         </dependency>
  8.         <dependency>
  9.             <groupId>group-a</groupId>
  10.             <artifactId>artifact-b</artifactId>
  11.             
  12.             <type>bar</type>
  13.         </dependency>
  14.     </dependencies>
  15. </project>
  16. <project>
  17.     ...
  18.     <dependencies>
  19.         <dependency>
  20.             <groupId>group-c</groupId>
  21.             <artifactId>artifact-b</artifactId>
  22.             
  23.             <type>war</type>
  24.         </dependency>
  25.         <dependency>
  26.             <groupId>group-a</groupId>
  27.             <artifactId>artifact-b</artifactId>
  28.             
  29.             <type>bar</type>
  30.         </dependency>
  31.     </dependencies>
  32. </project>
复制代码
在区域,实际上是根据{groupId, artifactId, type, classifier}来进行依赖匹配的。自从字段的默认值是jar以后,最简单的标识只需要设置{groupId, artifactId}即可。
依赖管理的另一个重要的作用是统一管理(控制)依赖的版本。这一点不再赘述。
2.  导入依赖
依赖可以继承,但是目前只支持单继承,可以通过“import”的方式从其它POM中导入依赖。
下面的例子,Z导入了X和Y管理的依赖。
  1. <project>
  2.     <modelVersion>4.0.0</modelVersion>
  3.     <groupId>maven</groupId>
  4.     <artifactId>Z</artifactId>
  5.     <packaging>pom</packaging>
  6.     <version>1.0</version>
  7.     <dependencyManagement>
  8.         <dependencies>
  9.             <dependency>
  10.                 <groupId>maven</groupId>
  11.                 <artifactId>X</artifactId>
  12.                 <version>1.0</version>
  13.                 <type>pom</type>
  14.                 <scope>import</scope>
  15.             </dependency>
  16.             <dependency>
  17.                 <groupId>maven</groupId>
  18.                 <artifactId>Y</artifactId>
  19.                 <version>1.0</version>
  20.                 <type>pom</type>
  21.                 <scope>import</scope>
  22.             </dependency>
  23.         </dependencies>
  24.     </dependencyManagement>
  25. </project>
复制代码
举个例子
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <parent>
  6.         <groupId>com.example</groupId>
  7.         <artifactId>demo-parent</artifactId>
  8.         <version>0.0.1-SNAPSHOT</version>
  9.     </parent>
  10.     <groupId>com.example</groupId>
  11.     <artifactId>demo001</artifactId>
  12.     <version>0.0.1-SNAPSHOT</version>
  13.     <dependencies>
  14.         <dependency>
  15.             <groupId>org.springframework.boot</groupId>
  16.             <artifactId>spring-boot-starter-web</artifactId>
  17.         </dependency>
  18.     </dependencies>
  19.     <dependencyManagement>
  20.         <dependencies>
  21.             <dependency>
  22.                 <groupId>org.springframework.boot</groupId>
  23.                 <artifactId>spring-boot-dependencies</artifactId>
  24.                 <version>2.7.11</version>
  25.                 <type>pom</type>
  26.                 <scope>import</scope>
  27.             </dependency>
  28.         </dependencies>
  29.     </dependencyManagement>
  30.     <build>
  31.         <plugins>
  32.             <plugin>
  33.                 <groupId>org.springframework.boot</groupId>
  34.                 <artifactId>spring-boot-maven-plugin</artifactId>
  35.                 <configuration>
  36.                     <excludes>
  37.                         <exclude>
  38.                             <groupId>org.projectlombok</groupId>
  39.                             <artifactId>lombok</artifactId>
  40.                         </exclude>
  41.                     </excludes>
  42.                 </configuration>
  43.             </plugin>
  44.         </plugins>
  45.     </build>
  46. </project>
复制代码
3.  版本管理插件
https://www.mojohaus.org/versions/versions-maven-plugin/index.html
versions插件用于管理、模块、依赖和插件的版。该插件有很多目标,为了统一管理父子项目版本号,我们这里只用其中三个。
操作很简单,首先,在父工程中引入versions插件
  1. <build>
  2.     <plugins>
  3.         <plugin>
  4.             <groupId>org.codehaus.mojo</groupId>
  5.             <artifactId>versions-maven-plugin</artifactId>
  6.             <version>2.16.2</version>
  7.             <configuration>
  8.                 <generateBackupPoms>false</generateBackupPoms>
  9.             </configuration>
  10.         </plugin>
  11.     </plugins>
  12. </build>
复制代码
然后,更新父工程的版本号
  1. mvn versions:set -DnewVersion="2.0.0-SNAPSHOT" //更新整个项目版本
复制代码
 接着,把子模块的版本更新成父工程的版本号
  1. mvn versions:update-child-modules
复制代码

 最后提交
  1. mvn versions:commit
复制代码


4.  BOM
对于一个项目来说,使用“库”中的一个或多个构件是相当常见的。为了使项目中使用的构件的版本与库中分发的版本保持同步。我们可以创建一个“物料清单”(BOM)以供其它项目使用。
简单的来讲,就是多个项目都需要依赖某些包时,为了方便管理版本,使得多个项目中引用的某个包的版本保持一致,这个时候我们就定义一个“库”,在这个库中统一定义包的版本,使用的时候只需要导入这个库即可。
举个例子:
定义一个库(其实就是一个POM)
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion>4.0.0</modelVersion>
  4.     <groupId>com.test</groupId>
  5.     <artifactId>mytest-bom</artifactId>
  6.     <version>1.0.0</version>
  7.     <packaging>pom</packaging>
  8.     <properties>
  9.         <project1Version>1.0.0</project1Version>
  10.         <project2Version>1.0.0</project2Version>
  11.     </properties>
  12.     <dependencyManagement>
  13.         <dependencies>
  14.             <dependency>
  15.                 <groupId>com.test</groupId>
  16.                 <artifactId>project1</artifactId>
  17.                 <version>${project1Version}</version>
  18.             </dependency>
  19.             <dependency>
  20.                 <groupId>com.test</groupId>
  21.                 <artifactId>project2</artifactId>
  22.                 <version>${project2Version}</version>
  23.             </dependency>
  24.         </dependencies>
  25.     </dependencyManagement>
  26. </project>
复制代码
然后,定义两个项目project1和project2
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion>4.0.0</modelVersion>
  4.     <parent>
  5.         <groupId>com.test</groupId>
  6.         <artifactId>mytest-bom</artifactId>
  7.         <version>1.0.0</version>
  8.     </parent>
  9.     <groupId>com.test</groupId>
  10.     <artifactId>parent</artifactId>
  11.     <version>1.0.0</version>
  12.     <packaging>pom</packaging>
  13.     <dependencyManagement>
  14.         <dependencies>
  15.             <dependency>
  16.                 <groupId>org.apache.logging.log4j</groupId>
  17.                 <artifactId>log4j-core</artifactId>
  18.                 <version>2.22.0</version>
  19.             </dependency>
  20.         </dependencies>
  21.     </dependencyManagement>
  22. </project>
复制代码
project1
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion>4.0.0</modelVersion>
  4.     <parent>
  5.         <groupId>com.test</groupId>
  6.         <artifactId>parent</artifactId>
  7.         <version>1.0.0</version>
  8.     </parent>
  9.     <groupId>com.test</groupId>
  10.     <artifactId>project1</artifactId>
  11.     <version>${project1Version}</version>
  12.     <packaging>jar</packaging>
  13.     <dependencies>
  14.         <dependency>
  15.             <groupId>org.apache.logging.log4j</groupId>
  16.             <artifactId>log4j-core</artifactId>
  17.         </dependency>
  18.     </dependencies>
  19. </project>
复制代码
project2
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion>4.0.0</modelVersion>
  4.     <parent>
  5.         <groupId>com.test</groupId>
  6.         <artifactId>parent</artifactId>
  7.         <version>1.0.0</version>
  8.     </parent>
  9.     <groupId>com.test</groupId>
  10.     <artifactId>project2</artifactId>
  11.     <version>${project2Version}</version>
  12.     <packaging>jar</packaging>
  13. </project>
复制代码
最后,在其它项目中引用project1和project2
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.                  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.         <modelVersion>4.0.0</modelVersion>
  4.         <groupId>com.test</groupId>
  5.         <artifactId>use</artifactId>
  6.         <version>1.0.0</version>
  7.         <packaging>jar</packaging>
  8.         <dependencyManagement>
  9.                 <dependencies>
  10.                         <dependency>
  11.                                 <groupId>com.test</groupId>
  12.                                 <artifactId>mytest-bom</artifactId>
  13.                                 <version>1.0.0</version>
  14.                                 <type>pom</type>
  15.                                 <scope>import</scope>
  16.                         </dependency>
  17.                 </dependencies>
  18.         </dependencyManagement>
  19.         <dependencies>
  20.                 <dependency>
  21.                         <groupId>com.test</groupId>
  22.                         <artifactId>project1</artifactId>
  23.                 </dependency>
  24.                 <dependency>
  25.                         <groupId>com.test</groupId>
  26.                         <artifactId>project2</artifactId>
  27.                 </dependency>
  28.         </dependencies>
  29. </project>
复制代码
可以看到,使用的时候,直接导入这个POM,然后按需引用


核心就是在一个公共的pom中定义包的版本和依赖管理,然后在使用的时候导入公共pom
假设现在在做一个项目,其中有两个子项目,在cjs-store-service中需要引用cjs-workflow-provider-api
先定义一个公共的pom
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <groupId>com.example</groupId>
  6.     <artifactId>cjs-dependencies-bom</artifactId>
  7.     <version>1.0.0-SNAPSHOT</version>
  8.     <packaging>pom</packaging>
  9.     <properties>
  10.         <store.version>0.0.4-SNAPSHOT</store.version>
  11.         <workflow.version>0.0.3-SNAPSHOT</workflow.version>
  12.     </properties>
  13.     <dependencyManagement>
  14.         <dependencies>
  15.             <dependency>
  16.                 <groupId>com.example</groupId>
  17.                 <artifactId>cjs-store-provider-api</artifactId>
  18.                 <version>${store.version}</version>
  19.             </dependency>
  20.             <dependency>
  21.                 <groupId>com.example</groupId>
  22.                 <artifactId>cjs-workflow-provider-api</artifactId>
  23.                 <version>${workflow.version}</version>
  24.             </dependency>
  25.         </dependencies>
  26.     </dependencyManagement>
  27. </project>
复制代码
项目中引用
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <parent>
  6.         <groupId>com.example</groupId>
  7.         <artifactId>cjs-store</artifactId>
  8.         <version>0.0.4-SNATHOST</version>
  9.     </parent>
  10.     <groupId>com.example</groupId>
  11.     <artifactId>cjs-store-service</artifactId>
  12.     <version>0.0.4-SNATHOST</version>
  13.    
  14.     <dependencies>
  15.         <dependency>
  16.             <groupId>com.example</groupId>
  17.             <artifactId>cjs-store-dto</artifactId>
  18.             <version>${project.parent.version}</version>
  19.         </dependency>
  20.         <dependency>
  21.             <groupId>com.example</groupId>
  22.             <artifactId>cjs-workflow-provider-api</artifactId>
  23.         </dependency>
  24.     </dependencies>
  25.    
  26.     <dependencyManagement>
  27.         <dependencies>
  28.             <dependency>
  29.                 <groupId>com.example</groupId>
  30.                 <artifactId>cjs-dependencies-bom</artifactId>
  31.                 <version>1.0.0-SNAPSHOT</version>
  32.                 <type>pom</type>
  33.                 <scope>import</scope>
  34.             </dependency>
  35.         </dependencies>
  36.     </dependencyManagement>
  37. </project>
复制代码
其实,这种依赖包管理可以学习一下dubbo

5.  项目启动问题
如果你的springboot项目起不来,控制台也不打印任何报错信息,就像这样

那么,你可以在SpringApplication.run()这一行打断点

然后,就可以看到报错了

6.  演示
Maven – Settings Reference (apache.org)
Maven – Guide to Mirror Settings (apache.org)
Maven – POM Reference (apache.org)
Maven – Best Practice - Using a Repository Manager (apache.org)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4