Maven: Как включить jar-файлы, которые недоступны в повторениях, в проект J2EE?
В моем проекте J2EE у меня есть пара зависимостей, которых нет ни в одном репозитории Maven, потому что они являются проприетарными библиотеками. Эти библиотеки должны быть доступны во время выполнения, поэтому их необходимо скопировать в целевой каталог /.../WEB-INF/lib ...
Прямо сейчас я перечисляю их как системные зависимости в моем POM, но с этим методом проблема заключается в том, что они не копируются в целевую сборку во время компиляции. Также этот метод не очень элегантен.
Так какой же самый лучший способ интегрировать их в Maven?
Примечание: я не хочу создавать свой собственный репозиторий Maven.
11 ответов
Как вы сказали, вы не хотите создавать свой собственный репозиторий, возможно, это поможет.
Вы можете использовать цель установки файла модуля maven-install-plugin, чтобы установить файл в локальный репозиторий. Если вы создаете сценарий с вызовом Maven для каждого файла и держите его рядом с jar-файлами, вы (и любой другой пользователь, имеющий доступ) можете легко установить jar-файлы (и связанные 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 сам. При необходимости он может работать на вашей машине разработки, и накладные расходы минимальны.
Для людей, которые хотят быстрого решения этой проблемы:
<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>
просто дайте вашей библиотеке уникальный идентификатор группы и имя артефакта и укажите, где она находится в файловой системе. Тебе хорошо идти.
Конечно, это грязное быстрое исправление, которое будет работать ТОЛЬКО на вашей машине, и если вы не измените путь к библиотекам. Но иногда это все, что вы хотите, чтобы запустить и сделать несколько тестов.
РЕДАКТИРОВАТЬ: просто перекрасить вопрос и понял, что пользователь уже использовал мое решение как временное решение. Я оставлю свой ответ в качестве быстрой помощи для других, которые приходят на этот вопрос. Если кто-то не согласен с этим, пожалуйста, оставьте мне комментарий.:)
Создайте папку репозитория под вашим проектом. Давайте принимать
${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>
Вам необходимо настроить локальный репозиторий, в котором будут размещаться такие библиотеки. Есть ряд проектов, которые делают именно это. Например Артефактура.
Ни одно из решений не работает, если вы используете сборку Jenkins!! Когда pom запускается на сервере сборки Jenkins... эти решения не сработают, так как при запуске Jenkins pom попытается загрузить эти файлы из корпоративного хранилища.
Скопируйте файлы в папку src/main/resources/lib (создайте папку lib). Они будут частью вашего проекта и пройдут весь путь до сервера развертывания. На сервере развертывания убедитесь, что ваши сценарии запуска содержат src/main/resources/lib/* в classpath. Виола.
Вы можете установить их в частном локальном хранилище (например,.m2/repository в вашем домашнем каталоге): более подробная информация здесь
Решение @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
Если я хорошо понимаю, что если вы хотите экспортировать зависимости на этапе компиляции, чтобы не было необходимости извлекать вручную все необходимые библиотеки, вы можете использовать mojo copy-зависимости.
Надеюсь, что это может быть полезно в вашем случае ( примеры)
Установка в одиночку не работает для меня.
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
Продолжайте использовать их как системную зависимость и скопируйте их в target/.../WEB-INF/lib ..., используя плагин зависимостей Maven:
http://maven.apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html
Вы можете попробовать использовать плагин maven-external-dependency-plugin, который показывает хороший способ добавления внешних jar-файлов в любой проект Maven.