Maven - переходные зависимости не разрешены для артефакта, развернутого в Artifactory.

У меня есть два проекта - A и B, где A зависит от B. Я упаковываю B как jar и развертываю его на сервере maven (artifactory), а затем включаю этот jar как обычную зависимость от проекта A в файл pom. jar файла B отображается в Maven Dependencies проекта A, но зависимости проекта B не отображаются в иерархии зависимостей. Это вызывает исключение class not found для зависимостей B.

Однако мой проект A и B находится в той же рабочей области eclipse. Когда я открываю проект B, проект A начинает ссылаться на проект B из рабочей области, а не из удаленного репозитория, и все работает хорошо.

Этот вопрос - Maven. Переходные зависимости ближе всего к моей проблеме, но зависимости моего проекта B НЕ являются необязательными.

Что здесь не так?

POM для проекта B

<?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.myapp</groupId> 
  <artifactId>utils</artifactId>
  <version>1.0.0-RELEASE</version>
  <packaging>jar</packaging>

  <name>utils</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

<!-- Following doesn't get added to project A -->
  <dependencies>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
  </dependencies>
</project>

POM для проекта A

<?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.myapp</groupId>
  <artifactId>core-app</artifactId>
  <version>1.0.0-RELEASE</version>
  <packaging>jar</packaging>

  <name>core-app</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>com.myapp</groupId>
      <artifactId>utils</artifactId>
      <version>1.0.0-RELEASE</version>
    </dependency>
  </dependencies>
</project>

Я использую архетип быстрого запуска maven. Структура моих проектов (которую я упаковываю как jar):

project-name
  src/main/java
  src/test/java
  pom.xml

person Anmol Gupta    schedule 16.05.2017    source источник
comment
Ваши помпы могут помочь разобраться в проблеме.   -  person davidxxx    schedule 16.05.2017
comment
Получаете ли вы исключение ClassNotFoundException внутри eclipse при запуске приложения? Если да, проект B в eclipse разрешает зависимость проекта A и не передается из Artifactory. Есть опция Resolve workspace artifacts, которая управляет этим.   -  person Shailesh Pratapwar    schedule 16.05.2017
comment
@davidxxx Обновил помпы, на данном этапе они действительно такие простые.   -  person Anmol Gupta    schedule 16.05.2017
comment
@Shinchan Я получаю исключение при выполнении теста junit внутри eclipse. На проект B направляют Artifactory, когда я закрываю проект B в рабочей области. Как только я открываю проект B в рабочей области, он начинает получать ссылки из самой рабочей области.   -  person Anmol Gupta    schedule 16.05.2017
comment
Хм, для первого помпа отсутствует groupId.   -  person davidxxx    schedule 16.05.2017
comment
@davidxxx Это была опечатка, извините.   -  person Anmol Gupta    schedule 16.05.2017
comment
Итак, я предполагаю, что вы получаете CNFE, даже когда проект B открыт в eclipse. Это означает, что зависимости в проекте B изначально неуместны. Проверьте, присутствует ли класс, для которого вы получаете CNFE, в зависимости B (как прямой, так и транзитивной).   -  person Shailesh Pratapwar    schedule 16.05.2017
comment
@Shinchan Он отлично работает, когда проект B открыт, и он разрешает зависимость от проекта B в рабочей области.   -  person Anmol Gupta    schedule 16.05.2017
comment
В порядке. Копия в artifactory самая последняя? Я надеюсь, что вы развернули артефакт B в артефакте с помощью mvn deploy: deploy на существующем pom B и не указали новый pom и явное имя файла jar.   -  person Shailesh Pratapwar    schedule 16.05.2017
comment
@Shinchan Я использую веб-интерфейс artifactory для загрузки jar вручную. И экспорт банки из затмения!   -  person Anmol Gupta    schedule 16.05.2017
comment
Вот и загвоздка. Используйте mvn deploy: deploy. Обратитесь к документации maven, чтобы узнать, как выполнить эту команду.   -  person Shailesh Pratapwar    schedule 16.05.2017
comment
@Shinchan Да, это сработало. Спасибо! Мне пришлось запустить maven deploy из eclipse с тегами управления зависимостями, предоставленными сервером artifactory.   -  person Anmol Gupta    schedule 16.05.2017


Ответы (1)


Для успешного разрешения транзитивных зависимостей jar проекта B и pom.xml должны быть доступны в репозитории Maven. При развертывании артефактов в удаленном репозитории убедитесь, что и jar, и pom.xml развернуты и доступны для загрузки.

Когда необходимые файлы развернуты в удаленном репозитории, используйте командную строку для сборки проекта A. Укажите цель сборки Maven, чтобы запустить загрузку всех зависимостей в локальный репозиторий Maven. Что-то вроде mvn compile или mvn package запустит загрузку и успешно построит проект A.

После того, как jar проекта B и pom.xml окажутся в локальном репозитории Maven, обновите проекты Maven в Eclipse, и они будут правильно перестроить и разрешить зависимости.

person Brent Worden    schedule 16.05.2017
comment
Спасибо, Брент! Я развертываю pom как часть упакованной банки, которая доступна в репозитории maven (сервере) как часть самой банки. Есть ли другой тип упаковки, на который мне нужно обратить внимание? - person Anmol Gupta; 16.05.2017
comment
@AnmolGupta Основываясь на вашем мнении, я обновил свой ответ, чтобы он был более лаконичным для ваших проектов. - person Brent Worden; 17.05.2017