Как управлять зависимостями в проекте Maven Muti через проект Multiple Maven
У меня ситуация с мавеном
── bom-porject
├── pom.xml
Этот проект просто используется для управления зависимостями для внешней зависимости maven.
Этот проект просто публикует pom-файл в maven repo
Эта бомба импортируется в различные проекты, разработанные с помощью <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-проекте
Тогда у меня есть еще один проект 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
от project-libs-root
в module-app-db
артефакт application-root
Где я должен упомянуть зависимость для module-lib-database
В настоящее время я откровенно называю это внутри <dependecies>
тег module-app-db pom.xml
Есть ли способ определить это в project-libs-root
и довел его до приложения через <dependencyMangement>
тег
3 ответа
Вероятно, вот как я бы попытался настроить проекты в соответствии с вашим описанием:
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-бом
<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>
Наконец, проект приложения-родителя, который будет использовать зависимости от 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
Дайте мне знать, если это работает с вами или нет.
Если я полностью понимаю ваши требования, я бы предложил "родительский pom" для внутренних зависимостей. Смысл, этот файл POM будет иметь <dependenciesManagement>
со всеми внутренними зависимостями.
Этот родительский pom будет иметь родителя, который является другим родительским pom, со сторонними зависимостями. Другие компоненты могут использовать этот родительский pom напрямую, без "внутреннего" родительского pom.
Надеюсь, что это имеет смысл.
У меня недостаточно репутации, чтобы комментировать, поэтому я использую ответ, но если вы прокомментируете, я могу ответить.
Как я помню, спецификация создается для определения пользовательской библиотеки со всеми зависимостями, необходимыми для моего проекта (-ов), и используется для отслеживания версий в одном месте, поэтому при обновлении одной или нескольких зависимостей я мне не нужно изменять все мои проекты, которые их импортируют.
Теперь я спрашиваю: было бы правильно в вашей структуре проекта иметь projects-lib-root
поделился со всеми подпроектами? И в этом случае, имеет ли смысл включать его в Bom-проект?
Как вы думаете?