Error al implementar un artefacto en Nexus

102

Recibo un error al implementar un artefacto en mi propio repositorio en un servidor Nexus: "Error al implementar artefactos: No se pudo transferir el artefacto" "Error al transferir el archivo http: /// my_artifact. El código de retorno es: 400"

Tengo Nexus ejecutándose con un repositorio personalizado my_repo con la siguiente configuración local de 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>
  • el usuario tiene permisos para crear / leer / escribir en 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>

y luego ejecuto

mvn deploy

y obtienes el error. ¿Alguna idea?

acimutal
fuente
2
HTTP 400 significa "solicitud incorrecta". Supongo que una de las URL es incorrecta.
Mark O'Connor
para mí el problema era que no era una versión instantánea.
maveroid

Respuestas:

156

Un par de cosas en las que puedo pensar:

  • las credenciales de usuario son incorrectas
  • la URL del servidor es incorrecta
  • el usuario no tiene acceso al repositorio de implementación
  • el usuario no tiene acceso al destino del repositorio específico
  • El artefacto ya está implementado con esa versión si es una versión (no la versión -SNAPSHOT)
  • el repositorio no es adecuado para la implementación del artefacto respectivo (por ejemplo, el repositorio de lanzamiento para la versión instantánea, repositorio proxy o grupo en lugar de un repositorio alojado)

Compruébelos y si aún tiene problemas, proporcione más detalles aquí.

Manfred Moser
fuente
44
Cambié la versión de mi artefacto a SNAPSHOT y luego lo implementé y todo estuvo bien. Luego me di cuenta de que estaba intentando implementar en un grupo Nexus (no en un repositorio Nexus), por lo que la causa de mi problema era: 'la URL de mi repositorio
Nexus
5
IMPORTANTE: "el artefacto ya está implementado con esa versión si es un lanzamiento (no la versión -SNAPSHOT)"
Bhushan
1
Salvé mi día ... eliminé la palabra -SNAPSHOT de la versión en pom.xml, es por eso que no se puede implementar en nexus ... agregué la palabra SNAPSHOT y funcionó ...
venugopal
3
En mi experiencia, las credenciales incorrectas dan como resultado 401, no 400. Sufijo el nombre de la versión con "-SNAPSHOT" solucionó el problema.
Marcus Junius Brutus
1
simplemente puede cambiar la política de implementación de su repositorio para habilitar la redistribución
Furqan
35

Solo para crear una respuesta separada. En realidad, la respuesta se encuentra en un comentario para la respuesta aceptada.

Intente cambiar la versión de su artefacto para terminar -SNAPSHOT.

bhagyas
fuente
2
No, se está perdiendo todo el punto, lea el comentario con atención que menciona "así que la causa de mi problema fue: 'la URL de mi repositorio nexus era incorrecta'". Y tenga una idea de lo que significa 'El código de retorno es: 400' (antes de copiar los comentarios de alguien como respuesta)
kuhajeyan
13
Solo quería comentar aquí desde que llegué a esta página en mi búsqueda. Me encontré con el mismo error 400 y lo que bhagyas dijo aquí es clave (aunque no me di cuenta en ese momento), si se implementa en un repositorio de instantáneas, la versión DEBE terminar en -SNAPSHOT. Mi versión era 1.13.0.SNAPSHOT y me tomó una hora darme cuenta de que necesitaba ser 1.13.0-SNAPSHOT.
Craig
16

400 Bad Request se devolverá si intenta:

  1. Desplegar una instantánea artefacto (o versión) que termina en -SNAPSHOT a un comunicado de repositorio
  2. Implementar un artefacto de lanzamiento (la versión que no termina en -SNAPSHOT ) en un repositorio de instantáneas
  3. Implementar la misma versión de un artefacto de lanzamiento más de una vez en un repositorio de lanzamiento
roj
fuente
7

Hoy tuve este problema exacto y el problema fue que la versión que estaba tratando de lanzar: realizar ya estaba en el repositorio de Nexus.

En mi caso, esto probablemente se debió a una desconexión de la red durante una invocación anterior de release: perform. Aunque perdí mi conexión, parece que el lanzamiento se realizó correctamente.

eidolon1138
fuente
7

En el raro caso de que necesite volver a implementar el artefacto MISMO ESTABLE en Nexus, fallará de forma predeterminada. Si luego elimina el artefacto de Nexus (a través de la interfaz web) con el propósito de implementarlo nuevamente, la implementación aún fallará, ya que simplemente eliminar el, por ejemplo, jar o pom no borra otros archivos que aún están en el directorio. Debe iniciar sesión en el cuadro y eliminar el directorio en su totalidad.

bosvos
fuente
2
Solo para agregar a esto, si no tiene acceso interactivo al servidor (yo no, es un cuadro administrado), puede eliminar el artefacto ofensivo con HTTP DELETE. Uso PostMan para este propósito
Nathan Russell
No estoy seguro de si es porque estoy usando el complemento del almacén de blob de S3, pero no veo una estructura de directorio que coincida con la estructura del repositorio. ¿Hay algún truco para identificar qué directorios eliminar? Todos mis archivos se nombran con un hash. Los directorios son del formatocontent/vol-{01-43}/chap-{01-47}
majikman
También puede eliminar todos los archivos de una versión navegando al directorio de versiones desde el repositorio, en lugar de buscar el artefacto en una búsqueda de tipo GAV. En la vista del repositorio, puede hacer clic con el botón derecho en el directorio para obtener una acción de eliminación para todos los archivos en ese GAV.
Christian Trimble
3

Hoy tuve el mismo problema con la adición "El código de retorno es: 400, ReasonPhrase: Bad Request". que resultó ser el problema "el artefacto ya está implementado con esa versión si es una versión" de la respuesta anterior ingrese la descripción del enlace aquí

Una solución que aún no se menciona es configurar Nexus para permitir la redistribución en un repositorio de versiones. Tal vez no sea una buena práctica, porque esto se establece por una razón, sin embargo, puede ir a "Configuración de acceso" en la pestaña "Configuración" de sus repositorios Nexus y establecer la "Política de implementación" en "Permitir redespliegue".

jonashackt
fuente
3
  • en la aplicación pom principal ==> Versión coloque la etiqueta de la siguiente manera: xxx-SNAPSHOT

ejemplo: 0.0.1-SNAPSHOT

  • "-SNAPSHOT": es muy importante
Fadid
fuente
2

Asegúrese de que no exista ya (artefacto y versión) en nexus (como lanzamiento). En ese caso, devuelva Bad Request.

danipenaperez
fuente
2

Para el error 400, consulte la "Política de implementación" del repositorio, por lo general, es "Desactivar redespliegue". La mayoría de las veces, la versión de su biblioteca ya está allí, por eso recibió un mensaje "No se pudo poner ' https: //yoururl/some.jar '. Se recibió el código de estado 400 del servidor: el repositorio no permite actualizar los activos:" su nombre del repositorio "

Entonces, tiene algunas opciones para resolver esto. 1- Permitir volver a implementar 2- Eliminar la versión de su repositorio que está intentando cargar 3- Cambiar el número de versión

Furqan
fuente
Permitir la redistribución del repositorio de versiones no suele considerarse una buena práctica. No hagas eso sin consideración.
Itaypk
1
@Itaypk tiene razón, por eso he sugerido algunas otras sugerencias. En mi opinión, cambiar la versión es mejor.
Furqan
1

Si alguna de las respuestas anteriores funcionó, puede crear un nuevo artefacto directamente desde el lado de administración de (Captura de pantalla de NEXUS adjunta a continuación).

  1. Login to nexusUI http: // YOUR_URL: 8081 / nexus (nombre de usuario: contraseña predeterminada del administrador : admin123 )
  2. Click repositories en el lado izquierdo y luego haga clic en el repositorio, por ejemplo: haga clic en liberar.
  3. Escoger artifact Upload (última pestaña).
  4. Elegir GAV definitioncomoGAV Param : luego ingrese su ID de grupo, ID de artefacto y versión.
  5. Elija el archivo Jar.
  6. Haga clic en cargar artefacto. Eso es !

Ahora podrá agregar la correspondencia en su proyecto. (Captura de pantalla a continuación)

ingrese la descripción de la imagen aquí

vipin cp
fuente
1

Esto también puede suceder si tiene una política de nomenclatura en torno a la versión, que prohíbe el número de versión que está intentando implementar. En mi caso, estaba intentando cargar una versión (para liberar el repositorio) 2.0.1pero luego descubrí que nuestra configuración de nexo no permite nada más que un número entero para las versiones.

Intenté más tarde con la versión 2y la implementé con éxito.

El mensaje de error definitivamente no ayuda:

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

Un mejor mensaje podría haber sido version 2.0.1 violates naming policy

viejo monje
fuente
0

La identificación del servidor debe coincidir con la identificación del repositorio de maven settings.xml

Ravi Petchimuthu
fuente