Як додати проект як залежність від іншого проекту?


76

Є два незалежні проекти ( myWarProjectі MyEjbProject). Отже, коли я будую myWarProjectI, мені потрібно встановити MyEjbProjectin в локальне сховище, щоб тоді я міг визначити в myWarProject як залежність і успішно упакувати myWarProject.

Чи є спосіб впоратися з цим, не встановлюючи MyEjbProjectокремо, а також не визначаючи як батьківські модулі.

Я знаю, що цього можна досягти за допомогою побудови мурашок, але цікаво, чи є спосіб впоратись через maven?

Ми можемо створити батьківський проект за допомогою "pom", а інші два перемістити під батьківський проект. Однак, на жаль, я не можу цього зробити, оскільки в даний час ми вже маємо ці два окремі проекти в CVS, і я не можу змінити структуру. Якщо я можу впоратись із цим файлом pom, це те, що я шукаю.


Привіт Саймоне, дякую за швидку відповідь. Насправді MyEjbProject - це ще один проект maven, який мені потрібно побудувати, коли будую myWarProject. Чи є спосіб визначити пом MyEjbProject у myWarProject?
kds

Скажіть, будь ласка: в чому вони залежать один від одного? Зараз виглядає так, ніби військовий проект залежить від ejb для створення повної веб-програми. У цьому випадку зрештою два проекти не були б настільки незалежними.
Саймон Хеллінгер

Я відредагував свою відповідь (додав щось наприкінці). Сподіваюся, це буде ближче до вашого запитання.
Саймон Хеллінгер

Друге редагування моєї відповіді, можливо, цього разу нам пощастило :)
Саймон Хеллінгер

Відповіді:


69

Якщо припустити, що MyEjbProject не є іншим проектом Maven, яким ви володієте або хочете побудувати його за допомогою maven, ви можете використовувати системні залежності, щоб зв’язати існуючий файл jar проекту так

<project>
   ...
   <dependencies>
      <dependency>
         <groupId>yourgroup</groupId>
         <artifactId>myejbproject</artifactId>
         <version>2.0</version>
         <scope>system</scope>
         <systemPath>path/to/myejbproject.jar</systemPath>
      </dependency>
   </dependencies>
   ...
</project>

Тим не менш, зазвичай є кращим (і кращим способом) встановити пакет до сховища, або зробивши його Maven-проектом і побудувавши його, або встановивши його так, як ви вже робите.


Якщо вони, однак, залежать один від одного, ви завжди можете створити окремий батьківський проект (повинен бути проектом "pom"), оголосивши два інші проекти його "модулями". (Дочірні проекти не повинні оголошувати третій проект своїм батьківським). Як наслідок, ви отримаєте новий каталог для нового батьківського проекту, де ви також, напевно, помістите два незалежних проекти, як це:

parent
|- pom.xml
|- MyEJBProject
|   `- pom.xml
`- MyWarProject
    `- pom.xml

Батьківський проект отримав би розділ "модулі", щоб назвати всі дочірні модулі. Потім агрегатор використовуватиме залежності в дочірніх модулях, щоб насправді з’ясувати порядок побудови проектів)

<project>
   ...
   <artifactId>myparentproject</artifactId>
   <groupId>...</groupId>
   <version>...</version>

   <packaging>pom</packaging>
   ...
   <modules>
     <module>MyEJBModule</module>
     <module>MyWarModule</module>
   </modules>
   ...
</project>

Таким чином, проекти можуть співвідноситись між собою, але (як тільки вони будуть встановлені в локальному сховищі) все одно будуть використовуватися самостійно як артефакти в інших проектах


Нарешті, якщо ваші проекти відсутні у пов’язаних каталогах, ви можете спробувати надати їх як відносні модулі:

filesystem
 |- mywarproject
 |   `pom.xml
 |- myejbproject
 |   `pom.xml
 `- parent
     `pom.xml

тепер ви можете просто зробити це (працював у maven 2, просто спробував):

<!--parent-->
<project>
  <modules>
    <module>../mywarproject</module>
    <module>../myejbproject</module>
  </modules>
</project>

Привіт Саймоне, так, як ви вже сказали, ми можемо створити батьківський проект з "pom" і перемістити інші два під батьківський проект. Однак, на жаль, я не можу цього зробити, оскільки в даний час ми вже маємо ці два окремі проекти в CVS, і я не можу змінити структуру. Якщо я можу впоратись із цим файлом pom, це те, що я шукаю.
kds

Ви можете відредагувати своє запитання за допомогою цієї додаткової інформації, яку ви щойно вказали у своєму коментарі: Це може пояснити вашу проблему для інших, хто намагається відповісти!
Саймон Хеллінгер

В крайньому випадку, якщо ніщо інше не допомагає: оскільки вони вже відокремлені, чи не могли б ви просто перевірити їх із CVS у відповідний підкаталог вашої локальної файлової системи? Перевірте MyEJBProject у каталозі "parent / myejbproject", а MyWarProject - "parent / mywarproject". Це, мабуть, кошмар технічного обслуговування ...
Саймон Хеллінгер

Дякую Саймоне. Мені було цікаво, яка найкраща практика для обробки подібних сценаріїв?
kds

Просто додав ще одне рішення, можливо це нарешті може допомогти. Про ваше останнє запитання в коментарях: я сам насправді ніколи не мав такого сценарію. Щоразу, коли ми будуємо окремі модулі, ми поміщаємо їх у центральне сховище (наприклад, sonatype nexus) для посилання на інші проекти. Отже, ви будуєте перший проект (скажімо, проект ejb), розгортаєте його, потім будуєте інший (військовий проект), використовуючи вже побудований артефакт проекту ejb, а не сам проект maven
Саймон Хеллінгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.