как включить зависимости 2-го уровня с помощью Maven - PullRequest
2 голосов
/ 06 октября 2010

У меня есть проект A, в котором зависимость pom.xml:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-email</artifactId>
        <version>1.2</version>
    </dependency>

обыкновенная электронная почта зависит от javax.mail-1.4.1

Я запустил mvn install для установки projectA.jar в локальный репозиторий Maven.

В проекте B я зависим от projectA.jar. Когда я запускаю проект B, он терпит неудачу из-за отсутствующего файла класса в javax:

DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
java.lang.ClassNotFoundException: com.sun.mail.smtp.SMTPTransport

Как я могу успешно запустить проект B без явного помещения записи maven для javax.mail jar?


EDIT:

Я думаю, что нашел проблему. Я использовал maven-shade-plugin с true, и он удалял org.apache.commons: commons-email: jar зависимости в установленном (.m2) проекте POM-файл.

Комментирование maven-shade-plugin для проекта A решило проблему зависимости.

1 Ответ

3 голосов
/ 06 октября 2010

Как я могу успешно запустить проект B без явного помещения записи maven для javax.mail jar?

Ну, это странно. c.s.m.s.SMTPTransport предполагается предоставить mail-1.4.1.jar, который является зависимостью commons-email. Проект B должен получить это транзитивно.

Не могли бы вы выполнить следующее в проекте B и опубликовать вывод

mvn dependency:tree

Обновление: В ваших зависимостях определенно что-то странное, и я не могу воспроизвести проблему.

Я быстро создал первый проект со следующим pom:

<project>
  ...
  <groupId>com.stackoverflow</groupId>
  <artifactId>Q3875317-A</artifactId>
  <dependencies>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-email</artifactId>
      <version>1.2</version>
    </dependency>
  </dependencies>
</project>

И еще один в зависимости от первого артефакта:

<project>
  ...
  <groupId>com.stackoverflow</groupId>
  <artifactId>Q3875317-B</artifactId>
  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>Q3875317-A</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</project>

А вот дерево зависимостей, которое я получаю для второго проекта:

$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'dependency'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Q3875317-B
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] com.stackoverflow:Q3875317-B:jar:1.0-SNAPSHOT
[INFO] +- com.stackoverflow:Q3875317-A:jar:1.0-SNAPSHOT:compile
[INFO] |  \- org.apache.commons:commons-email:jar:1.2:compile
[INFO] |     +- javax.mail:mail:jar:1.4.1:compile
[INFO] |     \- javax.activation:activation:jar:1.1:compile
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
...

Все там, как и ожидалось.

Если вы получили другой результат и если в ваших POM есть что-то заметное, пожалуйста, покажите их.

PS: я удалил одну из предложенных мною команд, поскольку она не позволяла видеть транзитивные зависимости.

...