Повторное использование Maven в poms

В нашем проекте Maven мы пробуем следующую структуру каталогов (всего около 80 проектов, показаны только несколько, чтобы вы поняли):

myappli      (pom)
-- module1       (pom)
--|-- utils    (pom)
--|-- ejb       (pom)
--|--|-- myappli-module1-a-ejb    (jar)
--|--|-- myappli-module1-b-ejb    (jar)
--|-- war       (pom)
--|-- applet       (pom)
...
-- module6       (pom)
--|-- utils       (pom)
--|-- ejb       (pom)
--|--|-- myappli-module6-c-ejb    (jar)
--|-- war       (pom)
--|-- applet       (pom)

Примечание: это плоская структура для Maven, так как все неконечные проекты имеют packaging значение "пом". (см. книгу BetterBuildsWithMaven).

Мы определяем версии зависимости в "dependencyManagement", в "myappli"Пом. Это работает отлично.

Наша проблема заключается в повторном использовании самих зависимостей. Например, зависимости ejb являются общими для всех проектов ejb (по замыслу). Мы не хотим вырезать и вставлять и поддерживать все это с каждым изменением!

Мы думали использовать некоторое "понятие импорта" для зависимостей ejb и определить наши зависимости ejb один раз на уровне приложения. Наши неудачные попытки были:

  • Мавен "parent pom"Понятие было бы хорошо, но оно уже используется модулями, поэтому оно не доступно для наших требований.
  • Средство импорта не найдено в Maven (за исключением зависимости от управления)
  • Определение сущности XML не распознано. Мы попробовали pom как следующее, и получили ошибку
    "Reason: Parse error reading POM. Reason: could not resolve entity named 'ejbDependencies'":

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE project [
    <!ENTITY ejbDependencies SYSTEM "./ejbDependencies.txt">
    ]>
    <project ...
    ...
    &ejbDependencies;
    ...


Отредактировано: я пробую решение, предложенное Робертом, но что-то не так.

Когда я компилирую свой проект ejb, он не находит сами зависимости. Я получаю сообщение об ошибке при компиляции (mvn compile), говоря, что отсутствует пакет javax.ejb.

Примечание: я запускал "mvn install" в проекте зависимостей раньше.

Это моя конфигурация:

<project ...>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.company</groupId>
    <artifactId>myproj-maven</artifactId>
    <version>3.1-SNAPSHOT</version>
  </parent>

  <groupId>com.company</groupId>
  <artifactId>myproj-maven-ejb</artifactId>
  <version>${myproj-version}</version>
  <packaging>pom</packaging>

  <dependencies>
    <dependency>
      <groupId>javax.ejb</groupId>
      <artifactId>ejb</artifactId>
    </dependency>

    <dependency>
      <groupId>ojdbc</groupId>
      <artifactId>ojdbc</artifactId>
    </dependency>
  </dependencies>
</project>

---------------------------------
<project ...>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.company</groupId>
    <artifactId>myproj-identite-ejb</artifactId>
    <version>3.1-SNAPSHOT</version>
  </parent>

  <groupId>com.company</groupId>
  <artifactId>myproj-identite-metier</artifactId>
  <name>SNR IDENTITE METIER</name>
  <version>2.0.1</version>
  <packaging>ejb</packaging>

  <dependencies>
    <dependency>
      <groupId>com.company</groupId>
      <artifactId>myproj-maven-ejb</artifactId>
      <version>${myproj-version}</version>
      <type>pom</type>
    </dependency>
  </dependencies>
</project>

Я не знаю, если это что-то меняет, но у нас есть иерархия, которая связывает два poms.
У нас есть строгая структура Maven, где каждый каталог объявляет все подкаталоги как модули maven, а каждый подкаталог объявляет родителя как родителя maven.
И общий родительский каталог является частью этой структуры.

+---maven
|   \---ejb
+---identite
|   +---ejb
|   |   \---SNR_IDENTITE_METIER

Отредактировано:

Ответ рифа кажется правильным. Это невозможно сделать с Maven, потому что наши зависимости предоставляются, и, следовательно, не переходные:-(

У нас действительно много проблем с настройкой Maven. Так много мелочей просто не работают. Сегодня я узнал, что цель сайта не может обрабатывать свойства, которые мы используем для номеров версий!

2 ответа

Решение

У ваших импортированных зависимостей есть предоставленная область? Действительно, эта область не является транзитивной (см. Области зависимостей Maven).

Это может быть причиной отсутствия замены.

Вы можете использовать pom-зависимости для импорта зависимостей в произвольные проекты.

Проект POM может выглядеть примерно так:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>persistence-deps</artifactId>
  <version>1.0</version>
  <packaging>pom</packaging>

  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate</artifactId>
      <version>${hibernateVersion}</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-annotations</artifactId>
      <version>${hibernateAnnotationsVersion}</version>
    </dependency>
  </dependencies>
</project>

И импортируется как:

<dependency>
  <groupId>com.example</groupId>
  <artifactId>persistence-deps</artifactId>
  <version>1.0</version>
  <type>pom</type>
</dependency>

Смотрите Maven, полное руководство - Группировка зависимостей для деталей.

Другие вопросы по тегам