очистка mvn без зависимостей

#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» в последующих сборках. Однако наш сервер сборки не обладает такой гибкостью. Я рассмотрел следующее:

  1. Переводим фазу в «предварительную очистку», но это предполагает, что все всегда используют clean в первый раз. Это не помогло бы, если бы кто-то просто запустил «mvn install».
  2. Копирование выполнения, одно из которых происходит во время «предварительной очистки», а другое — во время «проверки». Это охватывает все базы, но скопированный код оставляет неприятный привкус.

В идеале, я бы хотел какой-нибудь другой вариант. Возможно ли запустить чистый без зависимостей? Или запустить плагин дважды без необходимости полного копирования выполнения? Спасибо!

Ответ №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>
  

(Это из плагина Maven Clean: игнорирование ошибок очистки)

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

1. К сожалению, нет, ошибка failOnError не позволяет обойти невозможность разрешения зависимостей.

Ответ №4:

Вот еще одна возможность.

Настройте maven так, чтобы он пропускал фазу очистки и выполнял очистку во время инициализации. Хотя я этого не пробовал.

Недостатком этого является то, что maven всегда будет очищать выходные папки.