Почему Maven неправильно загружает снимки в репозиторий релизов?

Я пытаюсь использовать плагин maven-deploy-plugin для загрузки выпусков и снимков в репозиторий Nexus. Однако я сталкиваюсь с этой ошибкой

[INFO] [deploy:deploy {execution: default-deploy}]
[INFO] Retrieving previous build number from nexus
Uploading: http://localhost:8081/nexus/content/repositories/snapshots/info/afilias/edr/edr-app/1.0.4-SNAPSHOT/edr-app-1.0.4-20120605.140242-20.jar
56K uploaded  (edr-app-1.0.4-20120605.140242-20.jar)
[INFO] Uploading project information for edr-app 1.0.4-20120605.140242-20
[INFO] Retrieving previous metadata from nexus
[INFO] Uploading repository metadata for: 'artifact info.afilias.edr:edr-app'
[INFO] Retrieving previous metadata from nexus
[INFO] Uploading repository metadata for: 'snapshot info.afilias.edr:edr-app:1.0.4-SNAPSHOT'
[INFO] Retrieving previous build number from nexus
Uploading: http://localhost:8081/nexus/content/repositories/snapshots/info/afilias/edr/edr-app/1.0.4-SNAPSHOT/edr-app-1.0.4-20120605.140242-20.tar.gz
4286K uploaded  (edr-app-1.0.4-20120605.140242-20.tar.gz)
[INFO] [deploy:deploy-file {execution: default}]
Uploading: http://localhost:8081/nexus/content/repositories/releases/info/afilias/edr/edr-app/1.0.4/edr-app-1.0.4.tar.gz
89530K uploaded  (edr-app-1.0.4.tar.gz)
[INFO] Uploading project information for edr-app 1.0.4
[INFO] Retrieving previous metadata from remote-repository
[INFO] Uploading repository metadata for: 'artifact info.afilias.edr:edr-app'
[INFO] Retrieving previous build number from remote-repository
[INFO] repository metadata for: 'snapshot info.afilias.edr:edr-app:1.0.4-SNAPSHOT' could not be found on repository: remote-repository, so will be created
Uploading: http://localhost:8081/nexus/content/repositories/releases/info/afilias/edr/edr-app/1.0.4-SNAPSHOT/edr-app-1.0.4-20120605.140242-20.tar.gz
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error deploying attached artifact /home/mren/trunk2/target/edr-app-1.0.4-SNAPSHOT.tar.gz: Error deploying artifact: Failed to transfer file: http://localhost:8081/nexus/content/repositories/releases/info/afilias/edr/edr-app/1.0.4-SNAPSHOT/edr-app-1.0.4-20120605.140242-20.tar.gz. Return code is: 400

Вот моя конфигурация в pom.xml:

<project>
 ...
    <distributionManagement>
       <repository>
          <id>releases</id>
          <name>Releases</name>
          <url>http://localhost:8081/nexus/content/repositories/releases</url>
        </repository>
        <snapshotRepository>
          <id>snapshots</id>
          <name>Snapshots</name>
          <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
        </snapshotRepository>
      </distributionManagement>
  ...
  <build>
   ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.7</version>
        <executions>
          <execution>
            <phase>deploy</phase>
            <goals>
              <goal>deploy-file</goal>
            </goals>
            <configuration>
              <file>target/edr-install-1.0.4-${revision}.tar.gz</file>
              <url>${project.distributionManagement.repository.url}</url>
              <packaging>tar.gz</packaging>
              <artifactId>artifactId</artifactId>
              <groupId>groupId</groupId>
              <version>1.0.4-${revision}</version>
            </configuration>
          </execution>
        </executions>
      </plugin>
   ...
  </build>
...
</project>

И из моего файла settings.xml:

<settings>
  <server>
      <id>releases</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
    <server>
      <id>snapshots</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
  </servers>
  <profiles>
    <profile>
      <id>nexus</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>releases</id>
          <name>Releases</name>
          <url>http://localhost:8081/nexus/content/repositories/releases</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>snapshots</id>
          <name>Snapshots</name>
          <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
      </profile>
  </profiles>
</settings>

Я уверен, что эта конфигурация работала в какой-то момент, но теперь она выдает ошибку. Не уверен, что не так.

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

jvm 1    | 2012-06-04 14:16:31 INFO  [tp1706427008-35] - org.sonatype.nexus.proxy.maven.maven2.M2Repository - Storing of item releases:/info/afilias/edr/edr-app/1.0.4-SNAPSHOT/edr-app-1.0.4-20120604.181534-1.tar.gz is forbidden by Maven Repository policy. Because releases is a RELEASE repository
jvm 1    | 2012-06-04 14:16:31 ERROR [tp1706427008-35] - org.sonatype.nexus.rest.ContentPlexusResource - Got exception during processing request "PUT http://localhost:8081/nexus/content/repositories/releases/info/afilias/edr/edr-app/1.0.4-SNAPSHOT/edr-app-1.0.4-20120604.181534-1.tar.gz": Storing of item releases:/info/afilias/edr/edr-app/1.0.4-SNAPSHOT/edr-app-1.0.4-20120604.181534-1.tar.gz is forbidden by Maven Repository policy. Because releases is a RELEASE repository

person sonicfire3000    schedule 04.06.2012    source источник
comment
Вы проверяли лог-файлы Nexus?   -  person wjans    schedule 04.06.2012
comment
@wjans Да, у меня есть, и он говорит, что каким-то образом файл снимка пытается поместить в репозиторий выпуска.   -  person sonicfire3000    schedule 04.06.2012


Ответы (2)


Ваш файл settings.xml неверен. Настройте Maven для использования Nexus, правильно следуя главе книги. В частности. используйте настройки зеркала и URL-адрес там, а не конкретные URL-адреса для репозитория и pluginRepository.

Это мешает вашему правильному Maven pom и в конечном итоге пытается развернуть моментальный снимок в репозиторий выпуска, что неверно.

Кроме того, важно, чтобы вы использовали правильную цель/команду. Не используйте цель развертывания файла напрямую или около того.

Просто запустите команду

mvn clean deploy

на сборке.

И еще уточнение. Maven будет развертывать все, что определено из версии. Если он заканчивается на -SNASPHOT, это версия для разработки, которая будет опубликована в репозитории моментальных снимков (и позволит повторно развертывать, увеличивая номер версии), а если нет, то она считается выпуском и будет развернута в репозитории выпуска. Проект не может быть снапшотом и релизом одновременно. Это либо одно, либо другое.

Не смешивайте два понятия релиз и снимок!

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

person Manfred Moser    schedule 04.06.2012
comment
Если я уберу цель deploy-file, будут развернуты только моментальные снимки, а нужный файл останется нетронутым. - person sonicfire3000; 05.06.2012
comment
что значит нужный файл? - person Manfred Moser; 05.06.2012
comment
Я имею в виду, что файл, который я указал в конфигурации плагина развертывания, не загружается в репозиторий, когда я убираю цель развертывания файла. - person sonicfire3000; 05.06.2012
comment
Я понимаю, что делает ошибку, но я до сих пор не знаю, почему он пытается загрузить моментальный снимок в репозиторий релизов, когда я не говорю ему об этом. - person sonicfire3000; 05.06.2012
comment
Я бы серьезно подумал об использовании вспомогательного плагина сборки для вашего варианта использования. Он отлично справится с присоединением артефакта, и он будет развернут в моментальный снимок или выпущен так же, как основной артефакт. - person Manfred Moser; 05.06.2012

Это потому, что вы говорите Maven развернуть файл, который выглядит как снимок. Взгляните на свой файл конфигурации deploy:deploy-file. ${revision} имеет тот же формат, что и снимок, поэтому Nexus использует его:

target/edr-install-1.0.4-${revision}.tar.gz становится следующим: info/afilias/edr/edr-app/1.0.4-SNAPSHOT/edr-app-1.0.4-20120605.140242-20.tar. гз

Для справки регулярное выражение, которое Maven и Nexus используют для определения того, что является моментальным снимком, а что нет, описано здесь: http://www.sonatype.com/people/2008/05/maven-code-how-to-detect-if-you-have-a-snapshot-version/

Еще я бы порекомендовал не использовать deploy:deploy-file, вместо этого используйте buildhelper:attach, чтобы прикрепить этот tar.gz, и тогда файл будет назван соответствующим образом, избегая всех взломов, которые вы сделали с ревизией.

person Brian Fox    schedule 05.06.2012
comment
Когда я использую плагин buildhelper, файл edr-install-1.0.4-${revision}.tar.gz помещается в моментальные снимки. - person sonicfire3000; 06.06.2012
comment
Была та же проблема с недавней версией maven 3.3.9, версия выпуска была завершена короткой фиксацией, и случилось так, что неудачная сборка имела начало фиксации, состоящее только из чисел, что соответствовало предикату моментального снимка maven. Добавление пустой фиксации решило проблему, пока не будет найдено правильное решение. - person Brice; 26.07.2017