2012-04-26 16 views
6

¿Hay alguna forma de cambiar el número de versión sin editar el POM?¿Hay alguna forma de configurar la versión del Maven POM desde la línea de comandos?

<groupId>org.example</groupId> 
<artifactId>example</artifactId> 
<version>1.0.0</version> 

Tenemos un sistema de CI donde queremos liberar versiones compiladas, pero sin utilizar la solución -SNAPSHOT de Maven, por lo que si 1.0.0 es la versión actual, que sólo quieren tener CI-NIGHTLY-BIULD-20120426.

Sugerí que esto sería posible con algo como mvn deploy -Dversion=CI-NIGHTLY-BIULD-20120426, pero obviamente no. La mala solución sería dejar que el servidor de CI edite el pom.xml cada vez, pero creo que esto es muy desagradable.

¡Gracias!

+1

Si su problema es que -SNAPSHOT no es único, creo que la última versión de Nexus marca automáticamente el tiempo de la versión e instala incluso las instantáneas con usted Nike nombres. –

+0

¿Por qué no usar SNAPSHOT? Eso es exactamente para tales propósitos. De lo contrario, ¿por qué no usar versiones? (versión mvn: ... a través de CI) ..? – khmarbaise

+0

Ok, tal vez me oculté de mucha información, también tenemos un CI por etapas, así que lanzamos no solo todas las noches también cuando se cumplen varios requisitos, así que tenemos que cambiar la versión de '1.0.0' a' 1.0.0-STABLE' o '1.0.0-NIGHTLY' para separarlos. – codevour

Respuesta

6

Sugiero usar el clasificador.

<groupId>foo</groupId> 
<artifactId>bar</artifactId> 
<version>1.0</version> 

<properties> 
    <!-- default classifier is empty --> 
    <my.project.classifier></my.project.classifier> 
</properties> 

<build> 
... 
<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3.1</version> 
    <configuration> 
     <classifier>${my.project.classifier}</classifier> 
    </configuration> 
    <executions>...</executions> 
    </plugin> 
</plugins> 
</build> 

y

mvn package -Dmy.project.classifier=NIGHTLY-2012-04-26_02-30 

Maven documentation dice acerca de clasificador:

clasificador: Es posible que de vez en cuando encontrar un quinto elemento en el coordinar, y que es el clasificador. Visitaremos el clasificador más adelante, pero por ahora basta con saber que ese tipo de proyectos se muestran como groupId: artifactId: packaging: clasificador: versión.

y

El clasificador permite distinguir los artefactos que se construyeron a partir de la misma POM, pero difieren en su contenido. Es una cadena arbitraria opcional y que, si está presente, se agrega al nombre del artefacto justo después del número de versión. Como motivación para este elemento, considere, por ejemplo, un proyecto que ofrece un artefacto que se dirige a JRE 1.5 pero, al mismo tiempo, también un artefacto que aún admite JRE 1.4. El primer artefacto podría estar equipado con el clasificador jdk15 y el , el segundo con jdk14 para que los clientes puedan elegir cuál utilizar.

Otro caso de uso común para clasificadores es la necesidad de adjuntar artefactos secundarios al artefacto principal del proyecto. Si explora el repositorio central Maven , notará que las fuentes de clasificadores y javadoc se utilizan para implementar el código fuente del proyecto y los documentos API junto con los archivos de clase empaquetados.

+0

Esa es una buena idea. Aunque no estoy seguro si puedes mantener el clasificador en blanco en caso de compilaciones normales. –

+0

sí, puede dejar el clasificador en blanco – amra

-1

Usted puede parametrizar el número de versión que

<groupId>foo</groupId> 
<artifactId>bar</artifactId> 
<version>${my.project.version}</version> 

<properties> 
    <my.project.version>1.0</my.project.version> 
</properties> 

y conducir el número de versión de línea de comandos usando

mvn package -Dmy.project.version=NIGHTLY 

Aunque esto es posible, Maven 3 desalienta.

+0

Gracias, pero parece que esto quedará obsoleto en el futuro cercano. – codevour

+1

De hecho. Es por eso que puse el descargo de responsabilidad. –

+0

Esto no funcionará, no puede pasar el identificador de propiedad a la versión, Maven se quejará. – Bitmap

1

Te recomiendo la lectura Maven Releases on Steroids (part 2, part 3) por Axel Fontaine. Es genial, y estoy bastante feliz de usarlo.

No solo detalla cómo hacer lo que pide, sino que también contiene buenos consejos sobre cómo puede unir sus versiones de compilación con su servidor de CI.

En pocas palabras, aquí están los puntos principales:

  1. Maven liberación es lenta, se necesita hacer más rápido
  2. Usted parametarize su versión de proyecto como

    <version>${VERSION_NUMBER}</version> 
    ... 
    <properties> 
    ... 
        <VERSION_NUMBER>1.0-SNAPSHOT</VERSION_NUMBER> 
    ... 
    </properties> 
    
  3. local construye llegar esa versión: 1.0-SNAPSHOT
  4. Las versiones de lanzamiento se realizan solo de el servidor de CI
  5. En la configuración del proyecto Jenkins/Hudson se utilizan

    clean deploy scm:tag -DVERSION_NUMBER=${BUILD_NUMBER} 
    

De esta manera se obtiene una nueva versión con cada Jenkins construir, no sólo por las noches.


Usted puede cambiar la configuración para utilizar

clean deploy scm:tag -DVERSION_NUMBER=1.0.0-CI-NIGHTLY-BIULD-${BUILD_ID} 

y se podrían obtener versiones como 1.0.0-CI-NIGHTLY-BIULD-2012-04-26_12-20-24

+0

¡Genial! Muy útil ! – Chucky

2

Creo que también se podría utilizar versions plugin de Maven. Lo encuentro bastante útil para cosas como esta.

Se podía hacerlo en 2 pasos:

  1. configurar la versión necesaria: mvn versions:set -DnewVersion=CI-NIGHTLY-BIULD-20120426
  2. despliegue: mvn deploy
  3. en caso de que tenga que volver a los cambios, utilice mvn versions:revert (como sugiere Mark)
+1

Puede agregar un paso 3 que devolverá el POM a su estado original: "versiones mvn: revertir" –

+1

@ MarkO'Connor Tiene razón, he editado mi respuesta para incluir este detalle. –

Cuestiones relacionadas