#maven-2 #maven
#maven-2 #maven
Вопрос:
У меня есть сторонний jar, который необходим для нашего проекта. Он недоступен в центральном репозитории maven, поэтому я использовал maven-install-plugin для локальной установки jar во время сборки. Я привязал цель «установить файл» к фазе «проверки», и это в основном работает. The pom.xml выдержка из файла приведена ниже:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<id>install-myartifact</id>
<phase>validate</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>${basedir}/lib/myartifact-1.2.3.jar</file>
<groupId>com.example</groupId>
<artifactId>myartifact</artifactId>
<version>1.2.3</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>myartifact</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
Однако есть одна загвоздка. Большинство наших разработчиков и наша установка Jenkins запускают «mvn clean install». Фаза «проверки» не является частью жизненного цикла «очистки», и для выполнения clean необъяснимым образом требуются все зависимости. Итак, когда кто-то запускает эту сборку в первый раз, она не работает.
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building MyModule
[INFO] task-segment: [clean, install]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean]
[INFO] Deleting directory C:svntrunkmymoduletarget
Downloading: http://nexusserver.local:8080/nexus/content/groups/public/com/example/myartifact-1.2.3.pom
[INFO] Unable to find resource 'com.example:myartifact:pom:1.2.3' in repository central (http://central)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.
Missing:
----------
1) com.example:myartifact:jar:1.2.3
Try downloading the file manually from the project website.
Then, install it using the command:
mvn install:install-file -DgroupId=com.example -DartifactId=myartifact -Dversion=1.2.3 -Dpackaging=jar -Dfile=/path/to/file
Alternatively, if you host your own repository you can deploy the file there:
mvn deploy:deploy-file -DgroupId=com.example -DartifactId=myartifact -Dversion=1.2.3 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
Path to dependency:
1) com.example:mymodule:war:0.0.1-SNAPSHOT
2) com.example:myartifact:jar:1.2.3
----------
1 required artifact is missing.
for artifact:
com.example:mymodule:war:0.0.1-SNAPSHOT
from the specified remote repositories:
nexus (http://nexusserver.local:8080/nexus/content/groups/public)
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 second
[INFO] Finished at: Thu Jun 09 11:01:24 EDT 2011
[INFO] Final Memory: 17M/247M
[INFO] ------------------------------------------------------------------------
Если бы я просто запустил «mvn install», jar был бы установлен во время «проверки», и я мог бы запускать «mvn clean install» в последующих сборках. Однако наш сервер сборки не обладает такой гибкостью. Я рассмотрел следующее:
- Переводим фазу в «предварительную очистку», но это предполагает, что все всегда используют clean в первый раз. Это не помогло бы, если бы кто-то просто запустил «mvn install».
- Копирование выполнения, одно из которых происходит во время «предварительной очистки», а другое — во время «проверки». Это охватывает все базы, но скопированный код оставляет неприятный привкус.
В идеале, я бы хотел какой-нибудь другой вариант. Возможно ли запустить чистый без зависимостей? Или запустить плагин дважды без необходимости полного копирования выполнения? Спасибо!
Ответ №1:
Я столкнулся со связанной проблемой, и я нашел этот вопрос, когда искал решение в Google, поэтому я отмечу это здесь:
очистка mvn завершается сбоем в многомодульном проекте, когда в том же проекте отсутствуют зависимости, если во время очистки вызываются плагины.
Мы вызываем antrun-plugin во время фазы очистки в некоторых модулях, и из-за этого все зависимости должны присутствовать в репозитории maven, включая другие модули в том же reactor, которые в некоторых случаях еще не были созданы (скажем, вы только что обновили версию проекта или начинаете новый проект).
Это ошибка maven-antrun, о которой сообщается в https://issues.apache.org/jira/browse/MANTRUN-78 — что снова приводит к ошибке в ядре maven:https://issues.apache.org/jira/browse/MNG-3283 .
Мой обходной путь состоял в том, чтобы предоставить разработчикам (и Дженкинсу) альтернативный способ очистки (сценарий shell / bat, ant-скрипт или какую-либо операцию очистки git / hg) и заставить их вызвать это вместо этого.
Я бы предложил аналогичный обходной путь для вашей команды (или просто настройте общий репозиторий maven внутри вашей команды, при необходимости используйте один из компьютеров разработчика).
Комментарии:
1. Упомянутые ссылки теперь (02/2019) находятся на issues.apache.org/jira/browse/MANTRUN-78 и issues.apache.org/jira/browse/MNG-3283
2. Спасибо, @alleen 1. Я обновил ссылки в своем ответе.
Ответ №2:
Похоже, вы используете nexus. Возможно, было бы проще развернуть артефакт в репозитории nexus, чем поддерживать его в этом проекте.
Комментарии:
1. Это хорошая мысль, но мы работаем в международной корпорации с разрозненными командами разработчиков. Получение его на главном nexus — это длительный процесс. = (
2. Как насчет использования локального хранилища файлов? Вы могли бы упаковать файл в одноранговый / дочерний каталог с вашим модулем, а затем добавить этот каталог в качестве файла: repo в вашем pom.xml . Вы можете настроить свой settings.xml использовать ваше репозиторий nexus в качестве зеркала, но при этом разрешать локальные репозитории файлов.
3. Массовые запросы: изменение settings.xml не является стартовым, что повлияет на всех, кто использует сборку. Мне было бы лучше получить артефакт в главном nexus. Я собираюсь принять это как ответ, потому что, хотя это и не решает мою конкретную ситуацию, это должно быть для большинства людей.
4. В случае, если другим интересно, мое предложение о settings.xml состояло в том, чтобы изменить настройки вашего зеркала на <mirrorOf> внешние: *</mirrorOf>. Это позволило бы pom ссылаться на локальный репозиторий и обходить зеркало. Дополнительная информация здесь: maven.apache.org/guides/mini/guide-mirror-settings.html
Ответ №3:
Это непроверено, но можете ли вы не игнорировать ошибку из конфигурации плагина clean? Как в:
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<failOnError>false</failOnError>
</configuration>
</plugin>
Комментарии:
1. К сожалению, нет, ошибка failOnError не позволяет обойти невозможность разрешения зависимостей.
Ответ №4:
Вот еще одна возможность.
Настройте maven так, чтобы он пропускал фазу очистки и выполнял очистку во время инициализации. Хотя я этого не пробовал.
Недостатком этого является то, что maven всегда будет очищать выходные папки.