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

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

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

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

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

Ответ 1

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

Вы можете использовать установочный файл в maven-install-plugin для установки файла в локальный репозиторий. Если вы создаете script с вызовом 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. Он может запускаться в вашем окне разработки, если это необходимо, и накладные расходы минимальны.

Ответ 2

Для людей, желающих быстро решить эту проблему:

<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 и артефакт и укажите, где он находится в файловой системе. Вы хорошо пойдете.

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

EDIT: просто переустановите вопрос и поняли, что пользователь уже использовал мое решение в качестве временного исправления. Я оставлю свой ответ в качестве быстрой помощи другим, которые приходят к этому вопросу. Если кто-то не согласен с этим, оставьте мне комментарий.:)

Ответ 3

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

${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>

Ответ 4

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

Ответ 5

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

Скопируйте jars под src/main/resources/lib (создайте папку lib). Они будут частью вашего проекта и полностью перейдут на сервер развертывания. В сервере развертывания убедитесь, что ваши сценарии запуска содержат src/main/resources/lib/* в classpath. Viola.

Ответ 6

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

Ответ 7

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

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

Ответ 9

Только одна установка не работала для меня.

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

Ответ 10

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

Это именно то, что я искал. Способ проталкивать его для кода исследования. Ничего особенного. Да, я знаю, что все они говорят:) Различные решения для плагинов maven кажутся излишними для моих целей. У меня есть несколько банок, которые были предоставлены мне как сторонние библиотеки с файлом pom. Я хочу, чтобы он быстро компилировался/выполнялся. Это решение, которое я тривиально адаптировало к питону, произвело на меня чудеса. Вырезать и вставить в мой пом. Код Python/Perl для этой задачи находится в этом Q & A: Могу ли я добавить банки в 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

Ответ 11

Вы можете попробовать использовать maven-external-dependency-plugin, который показывает хороший способ добавления внешних банок в любой проект Maven.

https://code.google.com/p/maven-external-dependency-plugin/