如何在多个Maven项目中管理Maven Muti项目中的依赖项

时间:2018-02-14 14:38:09

标签: java maven dependency-management circular-dependency maven-bom

我遇到了maven的情况

── bom-porject
    ├── pom.xml 

这是bom proejct,仅用于外部maven依赖的依赖管理。

这个项目只是将一个pom文件发布到maven repo

此bom导入到通过<dependency Management>

开发的不同项目中

然后我有另一个项目

── project-libs-root
   ├── module-lib-database
   │   └── pom.xml <--- Module lib database POM 
   ├── module-lib-conversions
   │   └── pom.xml <--- Module lib conversion POM
   └── pom.xml     <--- project-libs-root

这是我正在开发的所有应用程序使用的一些常用库。

使用

project-libs-root pom.xml导入bom-porject pom.xml
<dependencyManagement>

我这样做可以访问bom-project

中定义的dependecies

然后我有另一个maven项目

── application-root
   ├── module-app-db
   │   └── pom.xml <--- Module apllication database POM
   ├── module-app-domain
   │   └── pom.xml <--- Module application domain POM
   ├── module-app
   │   └── pom.xml <--- Module application POM (this is a deployment)
   └── pom.xml     <--- application-root  

这是一个应用程序application-root pom.xml导入    project-libs-root pom.xml通过<dependencyManagement>.

通过这样做,我可以访问bom-porject pom.xml和依赖项    在其中定义

围绕内部模块的混乱部分,并使用它来管理它在项目中的依赖性例如

假设我需要在module-lib-database的{​​{1}}工件project-libs-root中使用工件module-app-db, 我应该在哪里提到application-root

的依赖性

目前我明确地在module-lib-database

<dependecies>标记内调用它

我有什么方法可以在module-app-db pom.xml中定义它并通过project-libs-root标记将其下载到应用程序

3 个答案:

答案 0 :(得分:1)

可能这就是我试图根据你的描述设置项目的方式:

parent-bom - 这将声明您的所有第三方依赖项在其他项目中维护一个版本

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>parent-bom</artifactId>
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>23.0</version>
      </dependency>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

lib-parent 您所描述的公共库的另一个多模块项目。

|-lib-parent
| |
| |- lib-db
| |   |
| |   | - pom.xml
| | ...
| |- pom.xml

<强> LIB-父

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>lib-parent</artifactId>
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>

  <modules>
    <module>lib-db</module>    
    <module>lib-bom</module>
  </modules>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.example</groupId>
        <artifactId>parent-bom</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

<强> LIB-分贝

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.example</groupId>
    <artifactId>lib-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>lib-db</artifactId>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
  </dependencies>

</project>

<强> LIB-BOM

<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/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
   <groupId>com.example</groupId>
   <artifactId>lib-parent</artifactId>
   <version>1.0-SNAPSHOT</version>
 </parent>
 <artifactId>lib-bom</artifactId>
 <packaging>pom</packaging>

 <dependencyManagement>
   <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>lib-db</artifactId>
       <version>${project.version}</version>
     </dependency>
   </dependencies>
 </dependencyManagement>

</project>

最后,application-parent项目将使用来自parent-bom的依赖项和来自lib-parent项目的公共库。

|- application-parent
| |
| |- module-app-db
| |  |
| |  | - pom.xml
| |  ...
| |- pom.xml

<强>应用父

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>application-parent</artifactId>
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>

  <modules>
    <module>module-app-db</module>    
  </modules>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>parent-bom</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>lib-bom</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>pom</type>
      <scope>import</scope>
    </dependency>
   </dependencies>
  </dependencyManagement>
</project>

<强>模块-APP-分贝

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.example</groupId>
    <artifactId>application-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>module-app-db</artifactId>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>lib-db</artifactId>
    </dependency>
  </dependencies>

</project>

要构建上述项目,请执行以下步骤:

$cd /path/to/parent-bom-dir && mvn clean install
$cd /path/to/lib-parent-dir && mvn clean install
$cd /path/to/application-parent-dir && mvn clean install

让我知道这是否适合你。

答案 1 :(得分:0)

我没有足够的声誉来评论,所以我正在使用答案,但如果你发表评论我可以回复。

我记得,创建了一个BOM来定义一个自定义库,其中包含我的项目所需的所有依赖项,并且它用于在一个地方跟踪版本,这样当我更新一个或者更多依赖项我不必费心修改导入它们的所有项目。

现在,我在问:在项目结构中,让projects-lib-root与所有子项目共享是否正确?在这种情况下,将它包含在bom项目中是否有意义?

您怎么看?

答案 2 :(得分:0)

如果我完全理解你的要求,我会建议你有一个父母的朋友&#34;对于内部依赖。意思是,这个pom文件将<dependenciesManagement>包含所有内部依赖项。

这个父pom将拥有一个父节点,它是另一个父节点,具有第三方依赖关系。其他组件可以直接使用此父pom,而无需(绕过)&#34;内部&#34;父母pom。

希望这是有道理的。