Повторно използване на 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 стойност на "pom". (виж книгата BetterBuildsWithMaven).

Ние дефинираме версиите на зависимостите в "dependencyManagement", в "myappli" pom. Това работи добре.

Проблемът ни е с повторното използване на самите зависимости. Например, ejb зависимостите са общи за всички ejb проекти (по дизайн). Не искаме да изрязваме и поставяме и да поддържаме всичко това с всяка промяна!

Мислехме да използваме някаква "идея за импортиране" за зависимостите на ejb и да дефинираме нашите зависимости ejb веднъж на ниво приложение. Нашите неуспешни опити бяха:

  • Понятието Maven "parent pom" би било добре, но то вече се използва от модулите, така че не е достъпно за нашите изисквания.
  • Не е намерено средство за импортиране в Maven (с изключение на dependencyManagement)
  • Дефиницията на 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. Толкова много малки неща просто не работят. Днес разбрах, че целевият сайт не може да обработва свойства, които използваме за номера на версия!


person KLE    schedule 02.09.2009    source източник


Отговори (2)


Вашите импортирани зависимости имат ли предоставен обхват? Всъщност този обхват не е преходен (вижте Maven Обхвати на зависимости).

Това може да е причината за незамяната.

person reef    schedule 03.09.2009

Можете да използвате pom dependencies за импортиране на зависимости в произволни проекти.

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, окончателното ръководство - Групиране Зависимости за подробности.

person Robert Munteanu    schedule 02.09.2009
comment
+1 за отговор, който изглежда перфектен. Опитвам го в момента. (забележка: преди няколко минути вие също редактирахте моята правописна грешка в друг отговор ;-) ) - person KLE; 02.09.2009
comment
Опитах това. Пускам mvn install на проекта за зависимости. След това компилирам моя ejb проект, той не намира самите зависимости. - person KLE; 03.09.2009
comment
За да проверя, стартирам help:effective-pom. Той не замества зависимостта от набор от зависимости. Това нормално ли е? Как мога да проверя къде греша? - person KLE; 03.09.2009
comment
Не мога да говоря за вашия конкретен сценарий, но бих се опитал или да го репликирам с много прост проект, или да намеря работещ пример някъде другаде. - person Robert Munteanu; 03.09.2009