Maven: Як включити банки, які недоступні у повторах, у проект J2EE?


100

у моєму проекті J2EE є пара залежностей, які недоступні в жодному сховищі Maven, оскільки вони є власницькими бібліотеками. Ці бібліотеки повинні бути доступними під час виконання, тому їх потрібно скопіювати на цільову /.../ WEB-INF / lib ...

Зараз я перераховую їх як залежність від системи в моїй POM, але з цим методом проблема полягає в тому, що вони не копіюються в цільову збірку під час компіляції. Також цей метод не дуже елегантний.

То який найкращий спосіб інтегрувати їх у Мейвен?

Примітка. Я не хочу створювати власне сховище Maven.


7
Я дійсно думаю, що вам слід переглянути рішення щодо створення сховища Maven. Це зовсім не важко і на 100% варто.
Роберт Мунтяну

7
Значення створення сховища Maven залежить від обставин.
yincrash

Відповіді:


54

Як ви вже говорили, що не хочете створити власне сховище, можливо, це допоможе.

Ви можете використовувати ціль встановлення файлу maven-install-плагін для встановлення файлу в локальний сховище. Якщо ви створите скрипт із викликом Maven для кожного файлу і зберігаєте його поруч з банками, ви (і будь-хто інший, хто має доступ), ви можете легко встановити банки (та пов'язані з ними файли пам’яті) до їх локального сховища.

Наприклад:

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

або просто

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

Потім ви можете вказати залежності як звичайні у своєму проекті.

Однак найкраще все-таки створити внутрішнє віддалене сховище, і я рекомендую сам використовувати Nexus . При потребі він може працювати на вашому вікні розробки, а накладні витрати мінімальні.


1
Дякуючи, цей метод зараз добре працює для мене. Я розширив POM, щоб файли автоматично встановлювались на локальний представник: pastebin.ca/1504318
samson

Рада допомогти, але, як казали інші, найкращим підходом було б використання менеджера сховищ Maven. Цей підхід не відповідає масштабам.
Багатий продавець

4
Команда, яка працювала для мене: "mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Упаковка = банку »
Мазрік

193

Для людей, які бажають швидкого вирішення цієї проблеми:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

просто дайте бібліотеці унікальну назву groupID та артефакту та вкажіть, де вона знаходиться у файловій системі. Вам добре піти.

Звичайно, це брудне швидке виправлення, яке ТІЛЬКИ працюватиме на вашій машині, і якщо ви не зміните шлях до ліб. Але іноді, це все, що ти хочеш, запустити і зробити кілька тестів.

РЕДАКТУВАТИ: просто перефарбуйте питання і зрозумів, що користувач вже використовував моє рішення як тимчасове виправлення. Я залишу свою відповідь як швидку допомогу для інших, хто приходить до цього питання. Якщо хтось не погоджується з цим, будь ласка, залиште мені коментар. :)


4
Класно. Чи є спосіб вказати URL замість локального шляху машини?
freakhead

3
Дякую за повний та робочий приклад !!! Я сподіваюсь, що ви зловите золоту рибку, і вона здійснить вам три побажання. :)
johndodo

14
Це має бути прийнятою відповіддю, оскільки вона є самодостатньою (в pom.xml)
Vikram

2
Привіт Раджарші, ідентифікатори групи та артефактів абсолютно довільні. Шлях до вашої банку у файловій системі - це все, що для цього важливо. Тому що насправді баночка - це не залежна від мавена, ти лише кажеш Мейвіну ставитися до неї як до одного.
Рік Джафе

1
Станом на 2016 рік, здається, це не працює. Збірка визнає шлях, але не включає код у затіненій банці. Щури ...
markthegrea

24

Створіть папку сховища під своїм проектом. Давай візьмемо

${project.basedir}/src/main/resources/repo

Потім встановіть власну баночку до цього репо:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

Нарешті, додайте наступні визначення репо та залежностей до проектів pom.xml:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>

1
Це дуже добре спрацювало для мене. PS Я рекомендував би інший каталог для місцевого репо, так як розміщення його в "src" не здавалося правильним (це не джерело!)
davidfrancis

1
Це спрацювало як шарм. Я мігрую старий проект з Мурахи до Мейвена, і в Інтернеті є кілька речей, яких я не можу знайти.
Пауло Педросо

Застереження: коли значення для -DlocalRepositoryPath не закінчується /(тобто вказує на папку), тоді він репо створюється з groupId. Наприклад: якщо ідентифікатор групи foo.comі локальнийRepositoryPath repo, то папка repo стає repo.foo.com.
Шешадрі Манта

Ця процедура є проектом, локальним для управління системними сховищами, використовуючи інструмент автоматизації побудови maven, який використовується в основному для проектів Java та файлової системи.
Олексій Кислицин

8

Потрібно створити локальне сховище, яке розмістить такі бібліотеки. Існує ряд проектів, які роблять саме це. Наприклад штучний .


4
Точка в термінології - це внутрішні віддалені сховища, а не локальні сховища. Локальне сховище - це те, на яке завантажуються залежності локальної файлової системи.
Багатий продавець

3

Жодне з рішень не працює, якщо ви використовуєте конструкцію Jenkins !! Коли Pom запускається на сервері побудови Дженкінса .. ці рішення вийдуть з ладу, оскільки запуск Дженкінса пом буде намагатися завантажити ці файли з корпоративного сховища.

Скопіюйте банки в src / main / ресурси / lib (створіть папку lib). Вони будуть частиною вашого проекту і пройдуть весь шлях до сервера розгортання. На сервері розгортання переконайтеся, що ваші сценарії запуску містять src / main / ресурси / lib / * у classpath. Віола.


2

Ви можете встановити їх у приватному локальному сховищі (наприклад, .m2 / сховище під домашнім каталогом): детальніше тут


7
Так, я міг би це зробити, але тоді я мав би сказати кожному, хто хоче створити проект, що він повинен помістити файли X, Y у каталог Z і це дійсно ускладнює справи. Зрештою, я хочу використовувати Maven для спрощення процесу збирання.
Самсон

2

Якщо я добре розумію, якщо те, що ви хочете зробити, це експортувати залежності під час фази компіляції, щоб не було необхідності вручну завантажувати кожну необхідну бібліотеку, ви можете використовувати залежності від копіювання mojo .

Сподіваюся, що це може бути корисним у вашому випадку ( приклади )


2

Рішення @Ric Jafe - це те, що працювало на мене.

Це саме те, що я шукав. Спосіб для просування коду для дослідницького тесту. Нічого фантазійного. Так, я знаю, що це всі кажуть :) Різні рішення плагінів Maven здаються непосильними для моїх цілей. У мене є кілька баночок, які мені подавали як сторонні лісти з файлом pom. Я хочу, щоб він швидко склався / запустився. Це рішення, яке я банально адаптував до пітона, творило для мене чудеса. Вирізати і вклеїти в мою пом. Код Python / Perl для цього завдання знаходиться в цьому запитанні: Чи можна додати банки до Maven 2 build classpath, не встановлюючи їх?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

Наведене вище рішення повертає 'зависимості.dependency.systemPath' для xx.jar не повинно вказувати на файли в каталозі проекту. Див stackoverflow.com/questions/10935135 / ...
sarah.ferguson


1

Самостійно встановити мені не вдалося.

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.