如何跨多个 Maven 项目管理 Maven Muti 项目中的依赖关系
How to Manage dependencies in Maven Muti Project across Multiple Maven Project
我遇到了 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
中定义的依赖项
那我还有一个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
和依赖项
里面有定义
关于内部模块的混乱部分以及在使用它的项目中管理它的依赖性例如
假设我需要在 application-root
的 module-app-db
工件中使用 project-libs-root
的工件 module-lib-database
,
我应该在哪里提及 module-lib-database
的依赖关系
目前我在 module-app-db pom.xml
的 <dependecies>
标签内明确调用它
有什么方法可以在 project-libs-root
中定义它并通过 <dependencyMangement>
标签将其提交给应用程序
我没有足够的声誉来发表评论,所以我正在使用一个答案,但如果你发表评论我可以回复。
我记得,创建了一个 BOM 来定义一个自定义库,其中包含我的项目所需的所有依赖项,它用于在一个地方跟踪版本,以便在我更新时一个或多个依赖项我不必费心修改所有导入它们的项目。
现在,我想问:在您的项目结构中将 projects-lib-root
与所有 sub-projects 共享是否正确?在这种情况下,将它包含在 bom-project 中是否有意义?
你怎么看?
如果我完全理解您的要求,我建议为内部依赖项设置 "parent pom"。意思是,这个 pom 文件将具有 <dependenciesManagement>
和所有内部依赖项。
这个父 pom 将有一个父 pom,这是另一个父 pom,具有第 3 方依赖项。其他组件可以直接使用此 parent-pom,而无需(绕过)"internal" 父 pom.
希望这是有道理的。
可能这就是我尝试根据您的描述设置项目的方式:
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-parent
<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-db
<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
application-parent
<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>
module-app-db
<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
让我知道这是否适合你。
我遇到了 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
中定义的依赖项那我还有一个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
和依赖项
里面有定义
关于内部模块的混乱部分以及在使用它的项目中管理它的依赖性例如
假设我需要在 application-root
的 module-app-db
工件中使用 project-libs-root
的工件 module-lib-database
,
我应该在哪里提及 module-lib-database
目前我在 module-app-db pom.xml
<dependecies>
标签内明确调用它
有什么方法可以在 project-libs-root
中定义它并通过 <dependencyMangement>
标签将其提交给应用程序
我没有足够的声誉来发表评论,所以我正在使用一个答案,但如果你发表评论我可以回复。
我记得,创建了一个 BOM 来定义一个自定义库,其中包含我的项目所需的所有依赖项,它用于在一个地方跟踪版本,以便在我更新时一个或多个依赖项我不必费心修改所有导入它们的项目。
现在,我想问:在您的项目结构中将 projects-lib-root
与所有 sub-projects 共享是否正确?在这种情况下,将它包含在 bom-project 中是否有意义?
你怎么看?
如果我完全理解您的要求,我建议为内部依赖项设置 "parent pom"。意思是,这个 pom 文件将具有 <dependenciesManagement>
和所有内部依赖项。
这个父 pom 将有一个父 pom,这是另一个父 pom,具有第 3 方依赖项。其他组件可以直接使用此 parent-pom,而无需(绕过)"internal" 父 pom.
希望这是有道理的。
可能这就是我尝试根据您的描述设置项目的方式:
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-parent
<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-db
<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
application-parent
<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>
module-app-db
<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
让我知道这是否适合你。