[英]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>.
導入project-libs-root pom.xml
<dependencyManagement>.
通過這樣做,我可以訪問bom-porject pom.xml
和其中定義的依賴項
內部模塊的混亂部分和管理它在項目中使用它的依賴關系例如
假設如果我需要在application-root
module-app-db
工件中application-root
project-libs-root
中的工件module-lib-database
,我應該在哪里提到module-lib-database
依賴關系
目前我明確地在module-app-db pom.xml
<dependecies>
標簽中調用它
有什么方法可以在project-libs-root
定義它並通過<dependencyMangement>
標簽將它放到應用程序中
可能,這就是我嘗試按照您的描述設置項目的方式:
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你描述的common lib的另一個多模塊項目。
|-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>
庫數據庫
<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
依賴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>
模塊應用程序數據庫
<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
讓我知道這是否適用於您。
我沒有足夠的聲譽發表評論,所以我正在使用答案,但如果您發表評論,我可以回復。
我記得,創建了一個 BOM 來定義一個自定義庫,其中包含我的項目所需的所有依賴項,它用於在一個地方跟蹤版本,以便當我更新一個或多個依賴項時不必費心修改我所有導入它們的項目。
現在,我問:在您的項目結構中讓projects-lib-root
與所有子項目共享是否正確? 在這種情況下,將它包含在 bom 項目中是否有意義?
你怎么認為?
如果我完全理解您的要求,我建議為內部依賴項設置一個“父 pom”。 意思是,這個 pom 文件將具有<dependenciesManagement>
和所有內部依賴項。
這個父 pom 將有一個父 pom,它是另一個父 pom,具有 3rd-party 依賴項。 其他組件可以直接使用這個 parent-pom,而無需(繞過)“內部”父 pom。
希望這是有道理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.