В нашия проект 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. Толкова много малки неща просто не работят. Днес разбрах, че целевият сайт не може да обработва свойства, които използваме за номера на версия!