Подтвердить что ты не робот

Как использовать 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

4b9b3361

Ответ 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, чтобы скопировать все.