Ошибка при развертывании артефакта в Nexus

Я получаю сообщение об ошибке при развертывании артефакта в моем собственном репозитории на сервере Nexus: "Не удалось развернуть артефакты: невозможно передать артефакт" "Не удалось передать файл http:///my_artifact. Код возврата: 400"

У меня Nexus работает с одним настраиваемым хранилищем my_repo со следующей локальной конфигурацией maven:

settings.xml

<server>
    <id>my_repo</id>
    <username>user</username>
    <password>pass</password>
 </server>
 ...
 <mirror>
    <id>my_repo</id>
    <name>Repo Mirror</name>
    <url><my_url_to_my_repo></url>
    <mirrorOf>*</mirrorOf>
  </mirror>
  • у пользователя есть права на создание / чтение / запись в my_repo -

pom.xml

<distributionManagement>
        <repository>
            <id>my_repo</id>
            <name>my_repo</name>
            <url><my_url_to_my_repo></url>
            <layout>default</layout>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <name>Snapshots</name>
            <url><my_url_to_my_snapshot_repo></url>
        </snapshotRepository>
    </distributionManagement>

и тогда я выполню

mvn deploy

и получите ошибку. Любая идея?

17 ответов

Решение

Несколько вещей, о которых я могу думать:

  • неверные учетные данные
  • URL-адрес сервера неверен
  • пользователь не имеет доступа к хранилищу развертывания
  • пользователь не имеет доступа к определенной цели хранилища
  • артефакт уже развернут с этой версией, если это релиз (не -SNAPSHOT версия)
  • репозиторий не подходит для развертывания соответствующего артефакта (например, выпуск репозитория для версии моментального снимка, репозитория или группы прокси вместо размещенного репозитория)

Проверьте это, и если у вас все еще есть проблемы, предоставьте больше деталей здесь.

Просто чтобы создать отдельный ответ. Ответ на самом деле находится в комментарии к принятому ответу.

Попробуйте изменить версию вашего артефакта до конца -SNAPSHOT,

400 Bad Request будет возвращен, если вы попытаетесь:

  1. Развернуть артефакт моментального снимка (или версию), заканчивающийся на -SNAPSHOT, в репозитории выпуска
  2. Разверните артефакт выпуска (версия не заканчивается на -SNAPSHOT) в хранилище снимков

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

В редких случаях, когда вам необходимо повторно развернуть артефакт SAME STABLE на Nexus, он по умолчанию завершится неудачей. Если затем вы удалите артефакт из Nexus (через веб-интерфейс) с целью его повторного развертывания, развертывание все равно будет неудачным, поскольку простое удаление, например, jar или pom не удалит другие файлы, все еще находящиеся в каталоге. Вы должны войти в систему и полностью удалить каталог.

У меня была именно эта проблема сегодня, и проблема заключалась в том, что версия, которую я пытался выпустить: перфоманс уже была в репозитории Nexus.

В моем случае это было вероятно из-за отключения сети во время более раннего вызова релиза: выполнить. Несмотря на то, что я потерял связь, похоже, что релиз завершился успешно.

У меня была такая же проблема сегодня с добавлением "Код возврата: 400, ReasonPhrase: Bad Request". проблема, которая оказалась "проблема уже развернута с этой версией, если это релиз" из ответа выше, введите описание ссылки здесь

Одно решение, которое еще не упомянуто, состоит в том, чтобы настроить Nexus, чтобы разрешить повторное развертывание в хранилище Release. Возможно, это не лучшая практика, потому что это установлено по какой-то причине, тем не менее, вы можете зайти в "Настройки доступа" в вкладке "Конфигурация" в репозитории Nexus и установить для "Политика развертывания" значение "Разрешить повторное развертывание".

  • в родительском приложении pom ==> Версия поместите тег следующим образом: xxx-SNAPSHOT

пример: 0.0.1-SNAPSHOT

  • "-SNAPSHOT": очень важно

Убедитесь, что он еще не существует (артефакт и версия) в Nexus (как выпуск). В этом случае верните Bad Request.

Для ошибки 400 проверьте репозиторий "Политика развертывания", обычно его "Отключить повторное развертывание". Большую часть времени ваша версия библиотеки уже существует, поэтому вы получили сообщение "Не удалось PUT поместить" https://yoururl/some.jar". Получил код состояния 400 от сервера: хранилище не позволяет обновлять ресурсы: " ваш имя хранилища "

Итак, у вас есть несколько вариантов решения этой проблемы. 1- разрешить повторное развертывание 2- удалить версию из вашего репозитория, которую вы пытаетесь загрузить 3- изменить номер версии

Если какой-либо из приведенных выше ответов сработал, Вы можете создать новый артефакт непосредственно со стороны администратора (снимок экрана NEXUS прилагается ниже).

  1. Login to nexus Пользовательский интерфейс http://your_url:8081/nexus(имя пользователя: пароль администратора по умолчанию: admin123)
  2. Click repositories на левой стороне, затем нажмите репо, например: нажмите релиз.
  3. выберите artifact Upload (последняя вкладка).
  4. выберите GAV definition как GAV Param- Затем введите свой идентификатор группы, идентификатор артефакта и версию.
  5. Выберите файл Jar.
  6. Нажмите загрузить артефакт. Это оно!

Теперь вы сможете добавить соответствующие ссылки в ваш проект (скриншот ниже).

введите описание изображения здесь

Это также может произойти, если у вас есть политика именования версий, запрещающая версию #, которую вы пытаетесь развернуть. В моем случае я пытался загрузить версию (чтобы выпустить репо) 2.0.1 но позже выяснилось, что наша конфигурация Nexus не допускает ничего, кроме целого числа для выпусков.

Позже попробовал с версией 2 и развернул его успешно.

Сообщение об ошибке определенно не помогает:

Return code is: 400, ReasonPhrase: Repository does not allow updating assets: maven-releases-xxx. -> [Help 1]

Лучшее сообщение могло бы быть version 2.0.1 violates naming policy

Я получал тот же статус ответа 400, и проблема была решена путем добавления -Dresume=false.

      mvn -B release:prepare release:perform -Dresume=false

В моем случае цель release:prepare была пропущена, и в выходных данных было зарегистрировано следующее сообщение.

      [INFO] Release preparation already completed. You can now continue with release:perform, or start again using the -Dresume=false flag

Я подозреваю, что я мог внести изменения в pom.xml, которые потребовали принудительного запуска release:prepare перед запуском release:perform.

      What worked for me was disabling the ReleaseProfile that comes with the release plugin and skipping the deployment in the deploy plugin
        
<plugin> 
   <groupId>org.apache.maven.plugins</groupId> 
   <artifactId>maven-release-plugin</artifactId> 
      <configuration> 
         <tagNameFormat>v@{project.version}</tagNameFormat
            <autoVersionSubmodules>true</autoVersionSubmodules> 
            <releaseProfiles>releases</releaseProfiles> 
            <useReleaseProfile>false</useReleaseProfile> 
      </configuration> 
</plugin>
           
<plugin> 
   <groupId>org.apache.maven.plugins</groupId> 
   <artifactId>maven-deploy-plugin</artifactId> 
      <configuration> 
         <skip>true</skip> 
      </configuration> 
</plugin>
    
Use mvn help:effective-pom

Посмотрите, как ваш CI выполняет развертывание после вашего шага. Для нас это было недавнее введение официального плагина Bitbucket Server Integration в Jenkins , который мгновенно срабатывал по нажатию от release:prepare.

Исправление состояло в том, чтобы добавить в плагин шаг для «Опрос игнорирует фиксации с определенными сообщениями» с: ^(?s)\[maven-release-plugin\].*(из /questions/399859/ostanovit-zapusk-reliza-mvn-povtoryat-sborki-jenkins/399862#399862)

Идентификатор сервера должен совпадать с идентификатором репозитория maven settings.xml

Другие вопросы по тегам