mvn clean без зависимостей - PullRequest
6 голосов
/ 09 июня 2011

У меня есть сторонняя банка, необходимая для нашего проекта. Он недоступен в центральном репозитории maven, поэтому я использовал maven-install-plugin для локальной установки jar во время сборки. Я привязал цель «install-file» к фазе «validate», и это в основном работает. Ниже приведена выдержка из файла 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». Этап «проверки» не является частью «чистого» жизненного цикла, и очистка необъяснимым образом требует наличия всех зависимостей для запуска. Поэтому, когда кто-то запускает эту сборку в первый раз, она не работает.

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building MyModule
[INFO]    task-segment: [clean, install]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean]
[INFO] Deleting directory C:\svn\trunk\mymodule\target
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 устанавливается во время "validate", и я могу запустить "mvn clean install" в последующих сборках. Однако наш сервер сборки не обладает такой гибкостью. Я учел следующее:

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

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

Ответы [ 4 ]

5 голосов
/ 14 августа 2012

Я столкнулся с проблемой, с которой столкнулся, и нашел этот вопрос, когда искал решение, поэтому отмечу здесь:

Сбой mvn clean в многомодульном проекте, если в этом же проекте отсутствуют зависимости, если плагины вызываются во время очистки.

Мы вызываем модуль antrun-plugin во время фазы очистки в некоторых модулях, и поэтому в репозитории maven должны присутствовать все зависимости, включая другие модули в том же реакторе, которые в некоторых случаях еще не были собраны (скажем, вы только что столкнулись с версией проекта или запускаете новый проект).

Это ошибка maven-antrun, о которой сообщалось в http://jira.codehaus.org/browse/MANTRUN-78 - которая снова приводит к ошибке в ядре maven: http://jira.codehaus.org/browse/MNG-3283.

Мой обходной путь состоял в том, чтобы предоставить разработчикам (и Дженкинсу) альтернативный способ выполнения clean (скрипт shell / bat, ant-скрипт или некоторая операция git / hg clean), и заставить их вызывать его вместо этого.

Я бы предложил аналогичный обходной путь для вашей команды (или просто настройте общий репозиторий maven внутри своей команды, при необходимости используйте одну из машин разработчика).

5 голосов
/ 09 июня 2011

Похоже, вы используете нексус.Возможно, проще развернуть артефакт в репозитории Nexus, чем поддерживать его в этом проекте.

0 голосов
/ 10 июня 2011

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

Сконфигурируйте maven, чтобы пропустить чистую фазу и запустить чистую при инициализации Не пробовал это все же.

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

0 голосов
/ 09 июня 2011

Это не проверено, но вы не можете игнорировать ошибку из конфигурации чистого плагина?Как в:

<plugin>
  <artifactId>maven-clean-plugin</artifactId>
  <version>2.4.1</version>
  <configuration>
    <failOnError>false</failOnError>
  </configuration>
</plugin>

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

...