Erro ao implantar um artefato no Nexus

102

Estou recebendo um erro ao implantar um artefato em meu próprio repositório em um servidor Nexus: "Falha ao implantar artefatos: Não foi possível transferir o artefato" "Falha ao transferir o arquivo http: /// my_artifact. O código de retorno é: 400"

Tenho o Nexus em execução com um repositório personalizado my_repo com a próxima configuração local do 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>
  • o usuário tem permissão para criar / ler / gravar em 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>

e então eu executo

mvn deploy

e obter o erro. Qualquer ideia?

acimutal
fonte
2
HTTP 400 significa "solicitação incorreta". Suponho que um dos URLs está incorreto.
Mark O'Connor
para mim, o problema era que não era uma versão instantânea.
maveroid

Respostas:

156

Algumas coisas em que posso pensar:

  • credenciais do usuário estão erradas
  • url para o servidor está errado
  • o usuário não tem acesso ao repositório de implantação
  • o usuário não tem acesso ao destino específico do repositório
  • artefato já está implementado com essa versão se for um lançamento (não a versão -SNAPSHOT)
  • o repositório não é adequado para implantação do respectivo artefato (por exemplo, release repo para versão instantânea, proxy repo ou grupo em vez de um repositório hospedado)

Verifique-os e, se ainda tiver problemas, forneça mais detalhes aqui.

Manfred Moser
fonte
44
Mudei a versão do meu artefato para SNAPSHOT e então implantei e tudo estava ok. Então percebi que estava tentando implantar em um grupo Nexus (não em um repositório Nexus), então a causa do meu problema era: 'url para meu repositório nexus estava errado'
acimutal de
5
IMPORTANTE: "o artefato já está implantado com essa versão se for um lançamento (não a versão -SNAPSHOT)"
Bhushan
1
Salvei meu dia ... Retirei a palavra -SNAPSHOT da versão em pom.xml, por isso não é possível implantar no nexus ...
Adicionei
3
Pela minha experiência, credenciais erradas resultam em 401, não 400. Sufixo o nome da versão com "-SNAPSHOT" corrigiu o problema para mim.
Marcus Junius Brutus
1
você pode simplesmente alterar a política de implantação do seu repositório para permitir a reimplantação
Furqan
35

Apenas para criar uma resposta separada. A resposta é realmente encontrada em um comentário para a resposta aceita.

Tente mudar a versão do seu artefato para terminar -SNAPSHOT.

bhagyas
fonte
2
Não, você está perdendo todo o ponto, leia o comentário com atenção que ele menciona "então a causa do meu problema foi: 'url para meu repositório Nexus estava errado'". E tenha uma ideia do que significa 'O código de retorno é: 400' (antes de copiar os comentários de alguém como resposta)
kuhajeyan
13
Só queria comentar aqui desde que cheguei a esta página em minha pesquisa. Eu encontrei o mesmo erro 400 e o que bhagyas disse aqui é a chave (embora eu não tenha percebido na época), se a implantação em um repositório de instantâneos, a versão DEVE terminar em -SNAPSHOT. Minha versão era 1.13.0.SNAPSHOT e demorei uma hora para descobrir que precisava ser 1.13.0-SNAPSHOT.
Craig
16

400 Bad Request será devolvido se você tentar:

  1. Implemente um artefato (ou versão) instantâneo terminando em -SNAPSHOT para um repositório de lançamento
  2. Implemente um artefato de liberação (versão não terminando em -SNAPSHOT ) em um repositório de instantâneo
  3. Implante a mesma versão de um artefato de lançamento mais de uma vez em um repositório de lançamento
roj
fonte
7

Eu tive exatamente esse problema hoje e o problema era que a versão que eu estava tentando lançar: perform já estava no repositório Nexus.

No meu caso, isso provavelmente foi devido a uma desconexão de rede durante uma chamada anterior de release: perform. Mesmo que eu tenha perdido minha conexão, parece que o lançamento foi bem-sucedido.

eidolon1138
fonte
7

No caso raro de você precisar reimplantar o artefato SAME STABLE no Nexus, ele falhará por padrão. Se você excluir o artefato do Nexus (por meio da interface da web) com o propósito de implementá-lo novamente, a implementação ainda falhará, uma vez que apenas remover o jar ou pom, por exemplo, não limpa outros arquivos que ainda estão no diretório. Você precisa fazer logon na caixa e excluir o diretório por completo.

Bosvos
fonte
2
Só para adicionar a isso, se você não tiver acesso interativo ao servidor (eu não - é uma caixa gerenciada), você pode excluir o artefato ofensivo com um HTTP DELETE. Eu uso PostMan para esta finalidade
Nathan Russell
Não tenho certeza se é porque estou usando o plug-in S3 blobstore, mas não vejo uma estrutura de diretório que corresponda à estrutura do repo. Existe algum truque para identificar quais diretórios excluir? Todos os meus arquivos são nomeados com um hash. Os diretórios são do formatocontent/vol-{01-43}/chap-{01-47}
majikman
Você também pode excluir todos os arquivos de uma versão navegando até o diretório da versão no repositório, em vez de procurar o artefato em uma pesquisa de tipo GAV. Na visualização do repositório, você pode clicar com o botão direito do mouse no diretório para obter uma ação de exclusão para todos os arquivos naquele GAV.
Christian Trimble
3

Tive o mesmo problema hoje com a adição de "O código de retorno é: 400, ReasonPhrase: Bad Request." que acabou sendo o "artefato já está implantado com aquela versão se for um problema de liberação" da resposta acima insira a descrição do link aqui

Uma solução não mencionada ainda é configurar o Nexus para permitir a reimplantação em um repositório de lançamento. Talvez não seja uma boa prática, porque isso é definido por um motivo, você pode ir para "Configurações de acesso" na guia "Configuração" de seus repositórios Nexus e definir a "Política de implantação" para "Permitir reimplantar".

Jonashackt
fonte
3
  • no aplicativo pom pai ==> Versão coloque a tag da seguinte forma: xxx-SNAPSHOT

exemplo: 0.0.1-SNAPSHOT

  • "-SNAPSHOT": é muito importante
Fadid
fonte
2

Certifique-se de que ainda não exista (artefato e versão) no nexo (como versão). Nesse caso, devolva o pedido incorreto.

danipenaperez
fonte
2

Para o erro 400, verifique o repositório "Política de implantação" geralmente é "Desativar reimplantar". Na maioria das vezes, a versão de sua biblioteca já está lá, por isso você recebeu uma mensagem "Não foi possível PUT colocar ' https: //yoururl/some.jar '. Código de status recebido 400 do servidor: Repositório não permite atualização de ativos:" seu nome do repositório "

Portanto, você tem algumas opções para resolver isso. 1- permitir reimplantar 2- excluir a versão de seu repositório que você está tentando carregar 3- alterar o número da versão

Furqan
fonte
Permitir a reimplantação para o repositório de lançamentos geralmente não é considerado uma boa prática. Não faça isso sem consideração.
Itaypk
1
@Itaypk você está certo, é por isso que sugeri algumas outras sugestões. Na minha opinião, mudar a versão é melhor.
Furqan
1

Se alguma das respostas acima funcionar, você pode criar um novo artefato diretamente do lado do administrador (captura de tela NEXUS anexada abaixo).

  1. Login to nexusUI http: // YOUR_URL: 8081 / nexus (nome de usuário: senha padrão do administrador : admin123 )
  2. Click repositories no lado esquerdo, clique no repositório, Por exemplo: clique em liberar.
  3. Escolha artifact Upload(última guia).
  4. Escolha GAV definitioncomoGAV Param - Em seguida, insira seu groupid, id do artefato e versão.
  5. Escolha o arquivo Jar.
  6. Clique em fazer upload do artefato. É isso aí !

Agora você poderá adicionar a resposta correspondente ao seu projeto. (Captura de tela abaixo)

insira a descrição da imagem aqui

vipin cp
fonte
1

Isso também pode acontecer se você tiver uma política de nomenclatura em torno da versão, proibindo a versão # que está tentando implantar. No meu caso, estava tentando fazer o upload de uma versão (para lançar o repo)2.0.1 mas depois descobri que nossa configuração de Nexus não permite nada além de um número inteiro para lançamentos.

Eu tentei mais tarde com a versão 2 e implantei com sucesso.

A mensagem de erro definitivamente não ajuda:

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

Uma mensagem melhor poderia ter sido version 2.0.1 violates naming policy

velho monge
fonte
0

O id do servidor deve corresponder ao id do repositório de maven settings.xml

Ravi Petchimuthu
fonte