2010-11-04 15 views
6

Actualmente estoy teniendo un problema al intentar configurar un proyecto para implementar en un repositorio interno de nexus. Como soy un poco nuevo para Maven en general, espero que haya algo que no entiendo realmente sobre cómo configurar la administración de distribución.¿Por qué Maven (¿incorrectamente?) Implementa mi SNAPSHOT en los repositorios de lanzamiento e instantánea?

El problema básico es que cuando ejecuto "mvn deploy" el artefacto se implementa correctamente en el repositorio de instantáneas, pero Maven también intenta implementarlo en el repositorio de versiones, que está fallando ... como debería. Mi comprensión de mi configuración actual es que NO debería implementarla en el repositorio de versiones también.

He incluido los diversos elementos de configuración a continuación, pero me pregunto si realmente se supone que debo administrar la sección con un perfil para que las compilaciones de instantáneas solo se hayan definido, y las versiones de lanzamiento solo se hayan definido.

Cualquier ayuda/aclaración sobre este tema sería muy apreciada.

Tengo el siguiente en mi POM para la gestión de distribución:

<distributionManagement> 
<repository> 
    <id>internal-releases</id> 
    <name>Internal Releases</name> 
    <url>http://localhost:8081/nexus/content/repositories/releases</url> 
</repository> 
<snapshotRepository> 
    <id>internal-snapshots</id> 
    <name>Internal Snapshots</name> 
    <url>http://localhost:8081/nexus/content/repositories/snapshots</url> 
</snapshotRepository> 
</distributionManagement> 

En otras partes del POM Tengo el siguiente configurado para permitir el uso de estos repositorios para obtener artefactos:

<repositories> 
<repository> 
    <id>internal-releases</id> 
    <url>http://localhost:8081/nexus/content/repositories/releases</url> 
    <snapshots><enabled>false</enabled></snapshots> 
</repository> 
<repository> 
    <id>internal-snapshots</id> 
    <url>http://localhost:8081/nexus/content/repositories/snapshots</url> 
    <snapshots><enabled>true</enabled></snapshots> 
</repository> 
<!-- other repos, etc, etc --> 
</repositories> 

I tener las configuraciones correctas en mi settings.xml para proporcionar credenciales para poder publicar en esta instancia de prueba nexus que se ejecuta en mi computadora, y de hecho está implementando exitosamente la instantánea.

El problema es que también trata de desplegar la instantánea en el repositorio de la liberación, que está configurado para no permitir instantáneas.

La salida de "mvn despliegan" incluye lo siguiente:

[INFO] [deploy:deploy {execution: default-deploy}] 
[INFO] Retrieving previous build number from internal-snapshots 
Uploading: http://localhost:8081/nexus/content/repositories/snapshots/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-8.war 
405K uploaded (service-1.0.0-20101104.170338-8.war) 
[INFO] Retrieving previous metadata from internal-snapshots 
[INFO] Uploading repository metadata for: 'snapshot com.internal:service:1.0.0-SNAPSHOT' 
[INFO] Retrieving previous metadata from internal-snapshots 
[INFO] Uploading repository metadata for: 'artifact com.internal:service' 
[INFO] Uploading project information for service 1.0.0-20101104.170338-8 
[INFO] [deploy:deploy-file {execution: default}] 
[INFO] Retrieving previous build number from remote-repository 
[INFO] repository metadata for: 'snapshot com.internal:service:1.0.0-SNAPSHOT' could not be found on repository: remote-repository, so will be created 
Uploading: http://localhost:8081/nexus/content/repositories/releases/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-1.jar 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Error deploying artifact: Failed to transfer file: http://localhost:8081/nexus/content/repositories/releases/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-1.jar. Return code is: 400 

El registro de Nexus contiene lo siguiente (lo que cabe esperar que a):

jvm 1 | 2010-11-04 13:03:39 INFO [p-759477796-118] - o.s.n.p.m.m.M2Repos~   - Storing of item releases:/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-1.jar is forbidden by Maven Repository policy. Because releases is a RELEASE repository 
jvm 1 | 2010-11-04 13:03:39 ERROR [p-759477796-118] - o.s.n.r.ContentPlex~   - Got exception during processing request "PUT http://localhost:8081/nexus/content/repositories/releases/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-1.jar": Storing of item releases:/com/internal/service/1.0.0-SNAPSHOT/service-1.0.0-20101104.170338-1.jar is forbidden by Maven Repository policy. Because releases is a RELEASE repository 

Respuesta

5

Así que la mejor idea en realidad resultó ser justo en frente de mis ojos en el registro. El único artefacto que creía que estaba produciendo el POM con el que estaba trabajando era un .war, pero notarás en el registro que el artefacto que Maven intenta desplegar en el lanzamiento es en realidad un .jar.

Esto fue suficiente de un puntero (que alguien en los usuarios Maven lista de correo en punta provisto) para buscar y, finalmente, se encontró que alguien había incluido la siguiente configuración adicional para la fase de implementación.

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-deploy-plugin</artifactId> 
<executions> 
<execution> 
    <phase>deploy</phase> 
    <goals> 
     <goal>deploy-file</goal> 
    </goals> 
    <configuration> 
     <packaging>jar</packaging> 
     <generatePom>true</generatePom> 
     <url>${project.distributionManagement.repository.url}</url> 
     <artifactId>${project.artifactId}</artifactId> 
     <groupId>${project.groupId}</groupId> 
     <version>${project.version}</version> 
     <file>${project.build.directory}/${project.build.finalName}.jar</file> 
    </configuration> 
    </execution> 
</executions> 
</plugin> 

Tenga en cuenta que esto es de hecho directamente ${project.distributionManagement.repository.url} referencia. Además, esta configuración estaba un poco equivocada y realmente debería haberse logrado a través de la propiedad attachClasses del plugin war.

2

Podría ser debido a que la artefacto versión no tiene el sufijo -SNAPSHOT?

+0

La versión 1.0.0-artefacto es instantánea, por lo que no. – imaginaryboy

+1

Esta respuesta debería ser un comentario, creo –

9
  1. Definir siguiente propiedad en su pom

    <deployFileUrl>${project.distributionManagement.snapshotRepository.url}</deployFileUrl> 
    
  2. Cambiar configuración del experto de implementar-plug-in de la siguiente manera:

    <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-deploy-plugin</artifactId> 
        <version>2.5</version> 
        <configuration> 
         <skip>true</skip> 
        </configuration> 
        <executions> 
         <execution> 
          <phase>deploy</phase> 
          <configuration> 
           <packaging>jar</packaging> 
           <generatePom>true</generatePom> 
           <url>${deployFileUrl}</url> 
           <artifactId>${project.artifactId}</artifactId> 
           <groupId>${project.groupId}</groupId> 
           <version>${project.version}</version> 
           <file>${project.build.directory}/${project.build.finalName}.jar</file> 
          </configuration> 
          <goals> 
           <goal>deploy-file</goal> 
          </goals> 
         </execution> 
        </executions> 
    </plugin> 
    
  3. Agregar siguiente perfil para establecer la propiedad deployFileUrl con repositorio url

    <profiles> 
        <profile> 
         <id>release-mode</id> 
         <properties> 
          <deployFileUrl>${project.distributionManagement.repository.url}</deployFileUrl> 
         </properties> 
        </profile> 
    </profiles> 
    
  4. Finalmente llaman a esto perfil de experto de liberación-plugin

    <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-release-plugin</artifactId> 
        <version>2.0-beta-9</version> 
        <configuration> 
         <releaseProfiles>release-mode</releaseProfiles> 
        </configuration> 
    </plugin> 
    
Cuestiones relacionadas