Повторное использование 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, полное руководство - Группировка зависимостей для деталей.