2011-05-26 9 views
6

Me gustaría poder desplegar solo el artefacto POM (archivo) sin el artefacto principal (JAR, WAR, etc.) al ejecutar mvn deploy y la versión es una versión SNAPSHOT.¿Cómo puedo desplegar solo el archivo pom en mi repositorio de instantáneas en Maven?

¿Por qué?

Tenemos varios desarrolladores que trabajan en varios proyectos de Maven. Tenemos un servidor Hudson con un trabajo por proyecto y versión de Maven (por ejemplo, foo-1.2, foo-1.3). Cada trabajo crea el proyecto y lo implementa en un servidor Nexus (en caso de éxito). Los proyectos de Maven en desarrollo están marcados como tales mediante el uso de -SNAPSHOT postfix en la versión. Por ejemplo: 1.2-SNAPSHOT, 1.3-SNAPSHOT.

A continuación, se incluye un ejemplo de cómo un trabajo de desarrollador está dañado debido a esta arquitectura.

Asuma dos proyectos Maven: foo-core y foo-webapp, ambos en la versión 1.2-SNAPSHOT.

  • El desarrollador A está trabajando en foo-core, realizó varios cambios y lo compiló.
  • El desarrollador A continúa trabajando, pero en foo-webapp.
  • El desarrollador B comenzó a trabajar y cambió foo-core. Compromete su trabajo y lo empuja al SCM.
  • Hudson es activado por SCM; Crea foo-core y lo implementa en el repositorio de instantáneas en Nexus.
  • El desarrollador A ejecuta mvn install en foo-webapp. Maven está consultando con Nexus, y descubre que hay una versión más nueva de foo-core en Nexus. Lo descarga (rellenado con cambios del desarrollador B) y falla la compilación, ya que los cambios realizados por el desarrollador A no están en el contenedor ubicado en el repositorio local. La descarga anula el archivo instalado allí por el desarrollador A.

soluciones existentes

Miré en experto de implementar-plugin, pero este plugin despliega todos los artefactos asociados al proyecto. Si tuvieran una forma de configurar qué artefactos desplegar, hubiera sido genial.

¿Hay alguna manera de resolver esto sin recurrir a la escritura de mi propio complemento de implementación, basado en maven-deploy-plugin?

Gracias,

Asaf

Respuesta

1

Nunca oí hablar de tal posibilidad, y también sería muy asombrado si eso fuera posible. Como el pom y el artefacto resultante son algún tipo de unidad, no tendría sentido (para mí) desplegar solo partes de ellos.

Sin embargo debe tener en cuenta para hacer un proyecto pom separado que especifica dependencias y plugins es posible que desee utilizar en sus proyectos JAR/WAR así:

<groupId>foo.bar</groupId> 
<artifactId>my-pom</artifactId> 
<version>1.0.0</version> 
<packaging>pom</packaging> 

y luego heredar ese proyecto pom por su JAR/Proyectos de WAR como este:

<parent> 
    <groupId>foo.bar</groupId> 
    <artifactId>my-pom</artifactId> 
    <version>1.0.0</version> 
</parent> 

Esto se llama project inheritance. Puede cambiar e implementar su proyecto pom independientemente de los artefactos "secundarios".

EDITAR después de la lectura de la motivación:

Según entiendo desea evitar experto para resolver los artefactos instantánea desde un repositorio (de modo que no se sobrescribirá la versión local). ¿Alguna vez ha intentado usar la opción mvn -nsu (consulte mvn -help)?

-nsu,--no-snapshot-updates    Suppress SNAPSHOT updates 

nunca probado, pero encontraron esta issue informó. Sin embargo, lo probaría (ya que el problema aún no se ha comentado).

+0

He editado mi pregunta, y añadió la motivación de la solicitud para aclarar mi pregunta mejor. –

+0

Estoy de acuerdo con @FrVaBe, y no creo que lo que pida puede hacerse, ni tampoco creo que sea la mejor solución para su situación de todos modos. Los indicadores '-nsu' y' -o' (fuera de línea) serían útiles para el Desarrollador A para evitar el problema. Sin embargo, si el Desarrollador A está creando el código desde el nivel superior de un proyecto de varios módulos, no debería ser necesario, ya que su versión local de foo-core tendrá prioridad sobre la nueva implementada por Hudson. Por último, de forma predeterminada, Maven busca actualizaciones instantáneas solo una vez cada 24 horas, por lo que esta situación ocurriría a lo sumo una vez al día por entorno. – ctrueden

7

Básicamente para el parámetro -Dfile, en lugar del artefacto, pase el pom.xml, pero simplemente hacer esto no es suficiente. También deberá proporcionar los parámetros -DgroupId y -DartifactId del proyecto. Ejecuta el comando y ¡sí! mvn deploy no le dará ningún problema ahora. A continuación se muestra un comando de despliegue:

$ mvn deploy:deploy-file -DpomFile=pom.xml -Dfile=./pom.xml -DgroupId=my.group.id -DartifactId=artifact-id -DrepositoryId=bigdata-upload-snapshots -Durl=http://maven.mymaven.com/content/repositories/snapshots/ 

Un requisito previo para esto es que el repositorio puede añadir en su settings.xml

+0

Si está utilizando '-DpomFile =' no necesita usar groupId y artifactId; ésos serán inferidos del pom. –

Cuestiones relacionadas