Как использовать POM как зависимость в Maven?
Есть ли способ добавить зависимость типа pom
к моему POM и получить все его модули?
JavaMail - хороший пример. Maven Central Repo имеет родительский POM: com.sun.mail: all: 1.5.0 с модулями: mail, mailapi, mailapijar, smtp, imap, gimap, pop3 и dsn.
Однако у артефакта "all" есть только один файл: pom.xml
Есть ли способ добавить этот "все" артефакт в зависимость от моего POM и получить все его модули? Я на 90% уверен, что это неправильный способ использования зависимостей в Maven, но я хочу услышать это от эксперта по Stack.
Идеи:
-
<dependencies><dependency>...<type>pom</type></dependency></dependencies>
-
<dependencyManagement><dependencies><dependency>...<type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
Связано: Netbeans: зависимости maven типа pom
Ответы
Ответ 1
Короткий ответ: вы не можете сделать это в Maven.
Другие ответы делают только зависимость "все" POM. Не решает проблему. Другой ответ пытается импортировать зависимости "все" POM. Мне не нужны зависимости; Мне нужны (дочерние) модули "всего" POM. Опять же, это не решает проблему.
Боковое примечание: я неправильно использовал библиотеку JavaMail. Мне нужно было только добавить одну зависимость: com.sun.mail: javax.mail: 1.5.0
Ответ 2
Вам нужно пойти с
<dependencies>
<dependency>
<groupId>com.my</groupId>
<artifactId>commons-deps</artifactId>
<type>pom</type>
</dependency>
</dependencies>
Это будет транзитно добавлять все зависимости, объявленные в com.my:commons-deps
, к вашему текущему POM.
Использование
<dependencyManagement>
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
работает как простая "включить" версии артефактов в вашем управлении зависимостями. Таким образом, он не добавит никакой зависимости в ваш проект.
Ответ 3
Я считаю, что вы можете создать свой собственный POM, который агрегирует нужные вам зависимости, а затем в вашем исходном проекте добавьте зависимость от этой совокупности pom. Вам все равно придется добавлять зависимости к каждому отдельному модулю в POM зависимости, но он будет абстрагирован от реальных POM-проектов и позволяет управлять этими зависимостями в одном месте, что может стать полезным, если вы в конечном итоге имеете несколько проектов, которые зависят на этом наборе зависимостей.
В вашем примере вы можете создать новый pom, как это:
<?xml version="1.0" encoding="UTF-8"?>
<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.mycompany</groupId>
<artifactId>mail-deps</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>mail</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>mailapi</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>mailapijar</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>imap</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>gimap</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>pop3</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>dsn</artifactId>
<version>1.5.0</version>
</dependency>
</dependencies>
</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">
...
<modules>
<module>src/main/java/com/mycompany</module>
</modules>
...
<dependencies>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>mail-deps</artifactId>
<version>1.0.0</version>
<type>pom</type>
</dependency>
</dependencies>
</project>
Ответ 4
Если pom, который вы пытаетесь импортировать, содержит зависимости, определенные в разделе <dependencies/>
, и вы хотите импортировать их все, вы можете попробовать код ниже.
( Отказ от ответственности: я не делал этого некоторое время): в разделе <dependencyManagement/>
добавьте зависимость pom следующим образом:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>kung.fu<groupId>
<artifactId>ninja</artifactId>
<version>1.2.3</version>
<scope>import</scope>
<type>pom</type> <!-- Not too sure if you needed this
when it scoped as import,
but just in case -->
</dependency>
</dependencies>
</dependencyManagement>
Возможно также, что вы определяете зависимость непосредственно в разделе <dependencies/>
, не нуждающемся в бит <dependencyManagement/>
, но, насколько я помню, он должен быть ограничен import
, как показано выше.
Ответ 5
Как уже писал выше: вы не можете этого сделать. Но это то, что я сделал, и это сработало.
Допустим, у вас есть некоторый файл pom (JavaMail в вашем примере) со следующим:
<type>pom</type>
<dependencyManagement><dependencies><dependency></dependencyManagement>
И вы хотите скопировать все банки, упомянутые в этом пом в каком-то месте.
Это то, что я сделал, и это быстро работающее решение
Откройте оригинальный pom и просто скопируйте все зависимости из исходного файла pom в новый pom как есть.
Конечно, используйте плагин зависимостей maven, чтобы скопировать все.