Maven: Как включить jar-файлы, которые недоступны в репозиториях, в проект J2EE?

100

в моем проекте J2EE у меня есть пара зависимостей, которые недоступны ни в одном репозитории Maven, потому что это проприетарные библиотеки. Эти библиотеки должны быть доступны во время выполнения, поэтому их нужно скопировать в целевой /.../ WEB-INF / lib ...

Прямо сейчас я перечисляю их как системные зависимости в моем POM, но с этим методом проблема в том, что они не копируются в целевую сборку во время компиляции. К тому же этот метод не очень элегантен.

Итак, как лучше всего интегрировать их в Maven?

Примечание: я не хочу создавать собственный репозиторий Maven.

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

Ответы:

54

Как вы сказали, вы не хотите создавать собственный репозиторий, возможно, это поможет.

Вы можете использовать цель install-file maven-install-plugin для установки файла в локальный репозиторий. Если вы создадите сценарий с вызовом Maven для каждого файла и сохраните его рядом с банками, вы (и любой другой, у кого есть доступ) можете легко установить банки (и связанные файлы pom) в свой локальный репозиторий.

Например:

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
Самсон
Рад помочь, но, как говорили другие, лучшим подходом было бы использование менеджера репозитория Maven. Такой подход плохо масштабируется.
Rich Seller
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. -Dpackaging = jar "
Мазрик
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>

просто дайте вашей библиотеке уникальный идентификатор группы и имя артефакта и укажите, где он находится в файловой системе. Тебе хорошо идти.

Конечно, это грязное быстрое исправление, которое будет работать ТОЛЬКО на вашем компьютере, и если вы не измените путь к библиотекам. Но иногда это все, что вам нужно, - запустить и провести несколько тестов.

РЕДАКТИРОВАТЬ: просто переформулируйте вопрос и понял, что пользователь уже использовал мое решение в качестве временного исправления. Я оставлю свой ответ, чтобы быстро помочь другим, кто придет к этому вопросу. Если кто-то не согласен с этим, оставьте мне комментарий. :)

Рик Джафе
источник
4
Прохладно. Есть ли способ указать URL-адрес вместо пути к локальному компьютеру?
phreakhead
3
Спасибо за полный и рабочий пример !!! Надеюсь, ты поймаешь золотую рыбку, и она исполнит тебе три желания. :)
johndodo 04
14
Это должен быть принятый ответ, поскольку он самодостаточен (в pom.xml)
Викрам
2
Привет, Раджарши, идентификаторы групп и артефактов совершенно произвольны. Путь к вашей банке в файловой системе - это все, что важно для работы. Поскольку на самом деле jar не является зависимостью maven, вы только говорите Maven, чтобы он относился к нему как к единице.
Ric Jafe 05
1
По состоянию на 2016 год, похоже, это не работает. Сборка подтверждает путь, но не включает код в заштрихованной банке. Крысы ...
markthegrea
24

Создайте папку репозитория под вашим проектом. Давайте принимать

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

Затем установите свой собственный jar в это репо:

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>
Mostar
источник
1
У меня это сработало очень хорошо. PS Я бы порекомендовал другой каталог для локального репо, поскольку помещать его в "src" было неправильно (это не источник!)
Дэвидфрансис 03
1
Оно работало завораживающе. Я переношу старый проект с Ant на Maven, и есть несколько библиотек, которые я не могу найти в веб-репозиториях.
Пауло Педросо
Внимание: если значение -DlocalRepositoryPath не заканчивается на /(т.е. указывает на папку), то репо создается с groupId. Пример: если идентификатор группы foo.comи localRepositoryPath равен repo, тогда папка репо становится repo.foo.com.
Sheshadri Mantha
Эта процедура является локальным проектом для управления системным репозиторием с использованием инструмента автоматизации сборки maven, используемого в основном для проектов Java и файловой системы.
Алексей Кислицын,
8

Вам необходимо создать локальный репозиторий, в котором будут размещаться такие библиотеки. Есть ряд проектов, которые делают именно это. Например Artifactory .

Григорий Мостицкий
источник
4
Что касается терминологии, это внутренние удаленные репозитории, а не локальные репозитории. Локальный репозиторий - это тот, в который загружаются зависимости локальной файловой системы.
Rich Seller
3

Ни одно из решений не работает, если вы используете сборку Jenkins !! Когда pom запускается на сервере сборки Jenkins .. эти решения не работают, поскольку Jenkins запускает pom будет пытаться загрузить эти файлы из корпоративного репозитория.

Скопируйте jar-файлы в src / main / resources / lib (создайте папку lib). Они будут частью вашего проекта и будут идти до сервера развертывания. На сервере развертывания убедитесь, что ваши сценарии запуска содержат src / main / resources / lib / * в пути к классам. Альт.

Апурва Сингх
источник
2

вы можете установить их в частном локальном репозитории (например, .m2 / repository в вашем домашнем каталоге): подробнее здесь

DFA
источник
7
Да, я мог бы это сделать, но тогда мне пришлось бы сказать всем, кто хочет создать проект, что он должен поместить файлы X, Y в каталог Z, и это действительно усложняет ситуацию. В конце концов, я хочу использовать Maven, чтобы упростить процесс сборки.
samson
2

Если я хорошо понимаю, если вы хотите экспортировать зависимости на этапе компиляции, чтобы не было необходимости извлекать вручную каждую необходимую библиотеку, вы можете использовать mojo copy-dependencies .

Надеюсь, это может быть полезно в вашем случае ( примеры )

Эрик Клериот
источник
2

Решение @Ric Jafe - это то, что сработало для меня.

Это именно то, что я искал. Способ протолкнуть его для исследования тестового кода. Ничего особенного. Да, я знаю, что все они говорят :) Различные решения плагинов maven кажутся излишними для моих целей. У меня есть несколько банок, которые были предоставлены мне как сторонние библиотеки с файлом pom. Я хочу, чтобы он быстро компилировался / запускался. Это решение, которое я тривиально адаптировал для Python, творило для меня чудеса. Вырезал и вставил в мою помпону. Код Python / Perl для этой задачи находится в этом разделе вопросов и ответов: Могу ли я добавить jar-файлы в путь к классам сборки maven 2 без их установки?

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
Павел
источник
Вышеупомянутое решение возвращает dependencies.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
Джонатан Хендлер
источник