2009-04-20 8 views
24

Estoy desarrollando una aplicación de escritorio con Java y Swing Application Framework. Tengo una aplicación sobre el cuadro y me gustaría que el cuadro contenga alguna indicación de qué versión se está probando. Mi preferencia es que ese valor se modifique de manera automatizada. Estoy usando CruiseControl para construir la aplicación desencadenada de los commits a SVN.¿Cuál es una buena manera de manejar un número de versión en una aplicación Java?

¿Qué mecanismo utilizan los demás para realizar este trabajo? ¿Hay una biblioteca de número de versión de cuadro o un conjunto de herramientas relacionadas con hormiga que puedo colocar en su lugar en mi proceso de compilación?

No estoy buscando opciones de implementación o de todos modos para buscar actualizaciones automáticamente o algo por el estilo. Solo quiero poder preguntarle a un verificador qué versión hay en el cuadro de información y obtener una respuesta confiable.

Respuesta

25

Comenzaré esta publicación diciendo que uso Apache Maven para compilar. También podrías hacer algo similar con Ant u otra herramienta, pero esto es lo que he hecho usando maven.

La mejor manera que he encontrado para manejar esto es utilizar la versión de su proyecto más la revisión de subversión como el número de compilación. Desde maven puedes incluir lo siguiente. Esto le dará el número de revisión de subversión como $ {scm.revision}.

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-scm-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>getting-scm.revision</id> 
      <phase>validate</phase> 
      <goals> 
       <goal>update</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 

Después de tener entonces, a continuación, utilizar esto como parte del archivo jar se manifiestan como la versión de implementación.

<plugin> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.1</version> 
    <configuration> 
     <archive> 
     <manifestEntries> 
      <Implementation-Version>${this.version}.${scm.revision}</Implementation-Version> 
     </manifestEntries> 
     </archive> 
    </configuration> 
    </plugin> 

Lo bueno de esto es que se puede acceder a ella desde código utilizando la siguiente:

Package p = getClass().getPackage(); 
String version = p.getImplementationVersion(); 

que le da el número de compilación completa como "1.0.13525", donde el último número es la revisión de subversión. Para obtener más información sobre cómo configurar esto, puede consultar el completo blog post que hice hace un tiempo sobre este tema.

+1

Nice answer. Gracias. – toolkit

+0

¡Excelente! ¿Se puede hacer usando Ant también? (Lo siento, n00b en el mundo de Java) – Upendra

+2

p.getImplementationVersion(); sigue devolviendo null cada vez que intento llamarlo – jonney

2

Lo está haciendo demasiado complicado. SVN proporciona el número de versión como una macro, como CVS.

Crear un inverface simple que contiene una constante, y tiene SVN una instancia que a través de una macro, como

public interface IVersionNumber { 
    public static final String version = "$Id$" ; 
} 

Usted necesita decir SVN utilizar palabras clave en ese archivo, como

$ svn propset sVN: palabras clave "Id" IVersion.java

Usted puede leer acerca de las propiedades here.

+0

No puede ser solo de un archivo. SVN proporciona una macro para obtener el último número de revisión para ese archivo. Mi objetivo es no tener que tocar ese archivo cada vez que realizo una confirmación. –

+0

Tendría que llamar a svnrevision para obtener el valor que quiero. Sería mejor que esa llamada suceda desde CruiseControl. –

+2

No, configurar la sustitución de palabras clave es exactamente lo que quiere. No tiene que tocar el archivo; SVN maneja eso. Y recuerde que, como SVN usa revisiones atómicas, el número de versión es el mismo para * todos * los archivos. –

7

Haga que el script de compilación cree un archivo de propiedad que contenga la versión. Es una buena idea tomar el número de revisión directamente desde SVN. De esta manera puede consultarlo en las pruebas. Coloque este archivo de propiedad en el contenedor empaquetado y léalo en tiempo de ejecución. Por lo general, las versiones principales y secundarias se establecen como parámetros para scr scr mientras la revisión se gestiona automáticamente por SVN y proporciona un número de compilación coherente para las referencias.

Este objetivo de fragmento ejecuta la línea de comando svn y las salidas en un archivo temporal (svndump). Luego, construyendo la cadena xx.yy.zz, colóquela en otro archivo que luego se incluirá en el jar. Tenga en cuenta que xx.yy se toman de parámetros externos, esta es la versión mayor-menor.

<target name="getrev"> 
    <exec executable="svn" output="svndump"> 
     <arg value="info"/> 
     <arg value="${my.svn.url}"/> 
    </exec> 

    <property file="svndump"/> 
    <property name="my.build" value="${Revision}"/> 
    <property name="my.rev" value="${my.ver}.${my.build}"/> 
    <echo message="current revision is ${my.rev}"/> 

    <property name="my.dir.dist" value="${my.dir.root}/dist/${my.rev}"/> 
    <echo message="${my.rev}" file="${my.dir.projects}/revision"/> 

    <delete file="svndump"/> 
</target> 
+0

+1. Yo hago esto también. – Damo

+0

Hay un proyecto llamado SVN-Ant que puede hacer las cosas del ejecutivo por usted. –

+0

Sí, svn-ant también lo haría ... aunque recuerdo cuando lo intenté, hubo algunos problemas con las dependencias.Tal vez ahora es más maduro, vale la pena intentarlo. – Dima

3

con Maven He utilizado el buildnumber-maven-plugin que obtiene el número de revisión de Subversion o utiliza una secuencia o una marca de tiempo, que luego es utilizado para reemplazar un marcador de posición ${buildNumber} donde quiera que te gusta. Supongo que otras herramientas de compilación y servidores de integración continua tienen características similares. Busque su motor de búsqueda favorito con "< su-herramienta> número de compilación".

1

Hemos usado JReleaseInfo durante mucho tiempo. Puede configurarlo en su script Ant (no usamos Maven para nuestros proyectos) y cambia el número de versión automáticamente. También tiene algunas bonitas adiciones, ya que genera una clase que contiene toda la información. Puede llamar a esa clase dentro de su código para obtener cadenas listas para usar o llamar a la clase desde la línea de comando para que imprima el número de versión sin necesidad de cambiar su código.

0

Desde que estoy usando cruise control y Ant que construir todo, terminé al menos por ahora, el uso de la propiedad ${label} pasado a la llamada hormiga para la construcción del proyecto. En mi archivo ant, utilizo Ant "replace" task para cambiar el archivo de propiedades que contiene el recurso about box llamado Application.version para incluir esa etiqueta.

Estoy planeando cambiar del label incrementer al svn label incrementer y luego usar el número de revisión svn de esa manera. Es solo un poco más de trabajo y requiere que realice cambios en el archivo de configuración de control de crucero.

Cuestiones relacionadas