Как распределить двоичную зависимость в maven?

#maven

#maven

Вопрос:

Я пытаюсь преобразовать проект из ant в maven.

Модульные тесты зависят от стороннего двоичного jar, который недоступен ни в одном общедоступном репозитории maven.

Как мне заставить maven справиться с этой ситуацией? Я нашел два решения, ни одно из которых не является приемлемым. Во-первых, использовать системную зависимость; это не работает, потому что а) зависимость должна быть только для тестов, и б) зависимость не найдена eclipse после создания проекта eclipse.

Во-вторых, вручную установить зависимость в локальном репозитории. Кажется, это рекомендуемый способ. Я не хочу этого делать, потому что я хочу, чтобы пользователи могли создавать и тестировать с помощью простого «mvn test». Если пользователям приходится читать документ и копировать / вставлять некоторые команды оболочки, чтобы иметь возможность создавать и тестировать, значит, что-то не так.

Я полагаю, было бы нормально, если бы maven сам установил зависимость в локальный репозиторий как часть сборки — возможно ли это, и если да, то как?

Ошибка.

Ответ №1:

Возможно, вы захотите взглянуть на install:install-file. Вы можете заставить его выполняться на ранней стадии вашего проекта ( validate или initialize ) с помощью стандартных средств.

С другой стороны, если это не удастся из-за отсутствия зависимости в том же проекте, есть еще пара вариантов. Один из них — вызвать ant script через antrun плагин для установки артефакта.

Или создайте дополнительный модуль, не зависящий от вашего артефакта, который будет выполнен до основного модуля, и попросите этот модуль установить артефакт, как описано ранее.

Комментарии:

1. Спасибо Алексу. Я не вижу способа проверить, находится ли jar уже в локальном репозитории, прежде чем добавлять его, поэтому я устанавливаю его при каждой сборке. Однако, похоже, все работает нормально. Вот соответствующий раздел из pom.xml:

Ответ №2:

Прежде всего, мой способ — использовать менеджер репозитория, такой как nexus, и установить эту зависимость туда.

Однако есть другое решение. Вы можете включить этот сторонний jar в свой проект, а с помощью тестового плагина вы можете настроить включение его в classpath таким образом:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.10</version>
    <configuration>
      <additionalClasspathElements>
        <additionalClasspathElement>path/to/additional/resources</additionalClasspathElement>
        <additionalClasspathElement>path/to/additional/jar</additionalClasspathElement>
      </additionalClasspathElements>
    </configuration>
  </plugin>
  

Кстати, я надеюсь, что вы знаете о том, что maven выполняет плагин surefire для запуска тестов по жизненному циклу по умолчанию.

Комментарии:

1. Спасибо Sessizlik, я не уверен, как здесь помогает nexus, я не хочу поддерживать репозиторий для доступа ко всему миру. Однако верная конфигурация classpath выглядит как раз так, как мне нужно. Ошибка.

2. Nexus очень прост в настройке, и вы, вероятно, в конечном итоге его настроите. Кроме того, таким образом вы можете избежать проверки jars в своем репозитории исходного кода.

3. @artbristol — Я пытаюсь сделать свой проект доступным для создания случайными людьми в Интернете. Как nexus помогает мне это сделать?

4. @Aled, ну, у вас должен быть хостинг для исходного кода вашего проекта. В зависимости от политики хостинга может быть достаточно просто добавить репозиторий Nexus только для чтения для двоичных артефактов.