Перейти к основному содержимому

Установите локальную банку с Maven

· 4 мин. чтения

1. Проблема и варианты

Maven — очень универсальный инструмент, и его общедоступные репозитории не имеют себе равных. Однако всегда будет артефакт, который либо нигде не размещен , либо зависит от репозитория, в котором он размещен, рискованно, поскольку он может не работать, когда он вам нужен.

Когда это происходит, есть несколько вариантов:

  • укусите пулю и установите полноценное решение для управления репозиторием , такое как Nexus
  • попытайтесь загрузить артефакт в один из более авторитетных публичных репозиториев
  • установить артефакт локально с помощью плагина maven

Nexus , конечно, более зрелое решение, но и более сложное . Предоставление экземпляра для запуска Nexus, настройка самого Nexus, его настройка и обслуживание могут быть излишними для такой простой проблемы, как использование одного jar-файла. Однако, если этот сценарий — размещение пользовательских артефактов — является распространенным, менеджер репозитория имеет большой смысл.

Загрузка артефакта в общедоступный репозиторий или непосредственно в Maven Central также является хорошим решением, но обычно длительным . Кроме того, библиотека может вообще не поддерживать Maven, что значительно усложняет процесс, поэтому использование артефакта СЕЙЧАС не является реалистичным решением.

Остается третий вариант — добавление артефакта в систему управления версиями и использование плагина maven — в данном случае плагин maven-install-plugin для его локальной установки до того, как он понадобится процессу сборки . Это, безусловно, самый простой и надежный вариант.

2. Установите локальную банку с помощью плагина maven-install-plugin .

Начнем с полной настройки, необходимой для установки артефакта в наш локальный репозиторий:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<groupId>org.somegroup</groupId>
<artifactId>someartifact</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<file>${basedir}/dependencies/someartifact-1.0.jar</file>
<generatePom>true</generatePom>
</configuration>
<executions>
<execution>
<id>install-jar-lib</id>
<goals>
<goal>install-file</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
</plugin>

Теперь давайте разберем и проанализируем детали этой конфигурации.

2.1. Информация об артефакте

Информация об артефакте определяется как часть элемента <configuration> . Фактический синтаксис очень похож на объявление зависимости — элементы groupId , ArtiftId и version .

Следующая часть конфигурации требует определения упаковки артефакта — она указывается как jar .

Затем нам нужно указать местоположение фактического файла jar для установки — это может быть абсолютный путь к файлу или относительный, используя свойства , доступные в Maven . В этом случае свойство ${basedir} представляет корень проекта, а именно место, где находится файл pom.xml . Это означает, что файл someartifact-1.0.jar необходимо поместить в каталог /dependencies/ под корнем.

Наконец, есть несколько других необязательных деталей , которые также можно настроить.

2.2. Выполнение

Выполнение цели install-file привязано к фазе проверки стандартного жизненного цикла сборки Maven . Таким образом, перед попыткой компиляции вам нужно будет явно запустить фазу проверки:

mvn validate

После этого шага стандартная компиляция будет работать:

mvn clean install

Как только фаза компиляции выполняется, наш файл someartifact-1.0.jar корректно устанавливается в наш локальный репозиторий, как и любой другой артефакт, который мог быть получен из центра Maven.

2.3. Генерация POM и поставка POM

Вопрос о том, нужно ли нам предоставлять файл pom.xml для артефакта или нет, зависит в основном от зависимостей времени выполнения самого артефакта. Проще говоря, если артефакт имеет зависимости времени выполнения от других jar-файлов, эти jar-файлы также должны присутствовать в пути к классам во время выполнения. С простым артефактом это не должно быть проблемой, поскольку он, скорее всего, не будет иметь зависимостей во время выполнения (лист в графе зависимостей).

Параметр generatePom в цели install-file должен быть достаточным для таких артефактов:

<generatePom>true</generatePom>

Однако если артефакт более сложный и имеет нетривиальные зависимости , то, если этих зависимостей еще нет в пути к классам, их необходимо добавить. Один из способов сделать это — определить эти новые зависимости вручную в файле pom проекта. Лучшим решением является предоставление пользовательского файла pom.xml вместе с установленным артефактом:

<generatePom>false</generatePom>
<pomFile>${basedir}/dependencies/someartifact-1.0.pom</pomFile>

Это позволит Maven разрешать все зависимости артефакта, определенные в этом пользовательском pom.xml , без необходимости определять их вручную в основном файле pom проекта.

3. Заключение

В этой статье рассказывается, как использовать jar, который нигде не размещен в проекте Maven, установив его локально с помощью maven-install-plugin .