Транзитивные зависимости не разрешены, если версия зависимостей определена в зависимости от родителей. Управление

У меня есть многомодульный проект с макетом, как показано ниже:

pom.xml
projA
  trunk
    pom.xml
    projA1
      pom.xml
    projA2
      pom.xml

В родительском pom я определил dependencyManagement и properties:

<properties>
  <javaee-api.version>6.0</javaee-api.version>
  <log4j.version>1.2.11</log4j.version>
</properties>
...
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
    </dependency>
    <dependency>
      <groupId>javax</groupId>  
      <artifactId>javaee-api</artifactId>
      <version>${javaee-api.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

pom.xml для projA2 содержит:

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
</dependency>

pom.xml для projA1 содержит:

<dependency>
  <groupId>${project.groupId}</groupId>
  <artifactId>projA2</artifactId>
  <version>${project.version}</version>
</dependency>

В projA1 я использую log4j, но зависимость транзитивна (из projA2).

Теперь, когда я запускаю mvn dependency:tree -X, я получаю:

[WARNING] Invalid POM for mypackage:projA2:jar:1.0, transitive dependencies (if any) will not be available, enable debug logging for more details: Some problems were encountered while processing the POMs:
[ERROR] 'dependencies.dependency.version' for javax:javaee-api:jar is missing. @ line 37, column 15
[ERROR] 'dependencies.dependency.version' for log4j:log4j:jar is missing. @ line 56, column 15

но чуть ниже этих строк я получаю:

[DEBUG]   testArtifact: artifact=log4j:log4j:jar:1.2.11:compile
[DEBUG]   includeArtifact: artifact=log4j:log4j:jar:1.2.11:compile
[DEBUG]   startProcessChildren: artifact=log4j:log4j:jar:1.2.11:compile
[DEBUG]   endProcessChildren: artifact=log4j:log4j:jar:1.2.11:compile
[DEBUG]   testArtifact: artifact=javax:javaee-api:jar:6.0:provided
[DEBUG]   includeArtifact: artifact=javax:javaee-api:jar:6.0:provided
[DEBUG]   startProcessChildren: artifact=javax:javaee-api:jar:6.0:provided
[DEBUG]   endProcessChildren: artifact=javax:javaee-api:jar:6.0:provided

Единственное решение - указать версию log4j (<version>${project.version}</version>) в projA2 pom.xml.

Вопрос: что я делаю неправильно:-(? Я не хочу указывать версии, которые уже определены в родительском разделе dependencyManagement.

Ответ 1

У меня возникла такая же проблема. В моем случае, если забыл обновить родительский POM в локальном репозитории. Попробуйте сделать

mvn install

для родительского модуля.

Ответ 2

Была аналогичная проблема. Удаление (вручную) всех проектов, участвующих в локальном репозитории, и запуск "mvn clean install" позже сработало для меня.

Ответ 3

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
</dependency>

должно быть в /projA/trunk/pom.xml вместо /projA/trunk/projA2/pom.xml.

Конечно, если вы хотите, чтобы это было доступно для всех ваших проектов, а не только для projA, оно должно быть в pom.xml.

Ответ 4

У меня была аналогичная проблема: я определил свойство в своем файле settings.xml и использовал его для системных папок в зависимостях в моих помах и моей родительской помпе. Пренебрежение "недопустимым" пакетом приводит к компиляции ошибок, поскольку пакеты, используемые в качестве транзитивных зависимостей, отсутствуют в пути к классам.

Я нашел (перенесен на вашу проблему), что если я назову maven с "mvn -Dlog4j.version = 2.1.11", предупреждение исчезнет, ​​а также ошибки компиляции. Для меня это не удовлетворительное решение, но оно решает проблему с невидимыми транзитивными зависимостями.

Ответ 5

У меня была такая же проблема, как и у ОП. Оказывается, это была ошибка maven, так как обновление к последней версии maven (3.3.3 с момента написания) решило проблему.

Ответ 6

Это может быть проблема с репозиторией, поиск ваших отсутствующих зависимостей, поиск правильных репозиториев и добавление к вам pom, как это:

<repositories>
        <repository>
            <id>jboss-3rd-party-releases</id>
            <url>https://repository.jboss.org/nexus/content/repositories/thirdparty-releases/</url>
        </repository>
    </repositories>

Ответ 7

Добавить

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>${log4j.version}</version>
</dependency>

В раздел dependencyManagement родительского POM (как и с JUnit). Любые дети, которые требуют log4j, могут указывать зависимость:

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
</dependency>

без версии, и он будет работать, потому что версия будет вытащена из родителя.