Maven: добавить локальные зависимости в jar

У меня есть зависимость

    <dependency>
        <groupId>de.matthiasmann</groupId>
        <artifactId>twl</artifactId>
        <version>1.0.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/TWL.jar</systemPath>
    </dependency>

Затем я выполняю mvn assembly:assembly, Добавлены все нативные файлы и удаленные maven-библиотеки, но этот jar отсутствует.

ОБНОВИТЬ

Когда я пытаюсь запустить приложение по java -jar myjar.jar, Это возвращает ошибку, что нет никакого класса от вышеупомянутой зависимости (NoClassDefFoundError: de.matthiasmann.twl.ForExample). Я хочу добавить классы из этого jar в myjar.jar (то же самое, что maven делает с удаленными зависимостями). Как я могу настроить Maven для этого?

4 ответа

Решение

См. Сборку Maven 2 с зависимостями: jar в области "system" не включен, чтобы узнать, почему системные зависимости не включены, и как вы можете обойти это, особенно mvn install:install-file код это то, что вы хотите.

Вы не можете использовать systemPath, если на вашем сервере / контейнере Java EE не настроен этот jar-файл.

Помните, что Maven - это только время разработки и компиляции. Как только файл war будет создан, maven не будет иметь никакого эффекта, за исключением того, что он поместит все нужные файлы в папку WEB-INF/lib.

Когда вы указываете область действия системы, это означает, что вы несете ответственность за обеспечение присутствия банки при развертывании войны. У вас уже есть среда для этого, и вы не хотите обременять свою зависимость сборки этим jar-файлом, но вы должны сделать его доступным через Maven только во время разработки.

Другая похожая область действия "предусмотрена". например, JBoss или ваша корпоративная среда развертывания Tomcat уже предоставляет множество jar-файлов, таких как Spring и Hibernate, которые загружаются при запуске сервера и являются общими для всех приложений на сервере. Следовательно, вы бы не хотели, чтобы maven build включал их в файл войны.

Правильный путь, скажут вам гевены Maven. это иметь свой собственный сервер maven и встраивать в него все необходимые артефакты. Однако иногда это невозможно.

Поэтому в таких случаях я создаю репозиторий на уровне проекта, который распространяется вместе с проектом и проверяется на контроль версий. Я запускаю команду mvn install создать каталог уровня проекта с именем, скажем, "проект-репо".

http://maven.apache.org/plugins/maven-install-plugin/examples/specific-local-repo.html (из-за фамильярности в большинстве случаев я строю репо вручную, а не запускаю mvn install).

Затем в POM я указываю file://${project.basedir}/project-repo в качестве одного из репозиториев. Предостережение в том, что в Windows косые черты, отличные от пары после "file://", должны быть обратными косыми чертами при обращении к путям файловой системы Windows.

  <repositories>
    <repository>
      <id>my-repo1</id>
      <name>my custom repo</name>
      <url>http://ho.ho.ho</url>
    </repository>
    <repository>
      <id>project-repo</id>
      <name>my project repo</name>
      <url>file://${project.basedir}\project-repo</url>
    </repository>
  </repositories>

Вы можете реализовать это разными способами, см. Блог ниже

http://blog.valdaris.com/post/custom-jar/

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

Другие вопросы по тегам