2010-10-23 21 views
15

Me gustaría mostrar la marca de tiempo de cuando la aplicación fue compilada en un cuadro sobre. Esto me permitirá rastrear diferentes versiones de la aplicación. ¿Cómo puedo recuperar esta información en Java?Mostrar la marca de tiempo de compilación en una aplicación

+2

que construyen herramienta que está utilizando? –

+0

¿Hay alguna manera de hacer esto en el entorno de compilación de NetBeans? – jacknad

+0

@JackN NB usa hormiga y maven. Depende de la herramienta de compilación que esté utilizando. en proyecto simple NB utiliza ANT así que sigue la solución dada para ant –

Respuesta

7

Necesita decirle a su proceso de compilación que coloque la marca de tiempo en un archivo de propiedades de Java, desde donde su aplicación puede leerlo. Otra buena opción para ponerlo sería el archivo de manifiesto jar.

Para la hormiga, desea utilizar las tareas tstamp y property, consulte this for an example.

Mientras tanto, es posible que también desee incluir un número de revisión de control de fuente.

+0

Además del archivo de propiedad, prefiero poner el número de compilación y el tiempo de compilación en una clase de versión como parte de la fuente y usar eso para informar. Los archivos de propiedades tienden a copiarse en nuevas instalaciones, lo que hace probable que se informe una versión incorrecta. (¡De esta forma, la aplicación puede registrar si el número de compilación en el archivo de propiedades! = El número de compilación incorporado). – rsp

+0

Explíquelo explícitamente como un archivo. Solo leer las marcas de tiempo de los archivos se romperá si el archivo es, p. embalado más tarde. –

+0

"Los archivos de propiedades tienden a copiarse en nuevas instalaciones, lo que hace probable que se informe de una versión incorrecta". Esos archivos deberían terminar dentro del archivo jar. Nadie se mete con ellos (y si lo hacen, ese es su problema). – Thilo

2

para Maven:

En pom.xml, agregue el siguiente

<resources> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    </resource> 
</resources> 

<filters> 
    <filter>${basedir}/target/filter.properties</filter> 
</filters> 

usar Maven antRun plugin para generar el tiempo de construcción,

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-antrun-plugin</artifactId> 
<executions> 
    <execution> 
    <phase>generate-resources</phase> 
    <goals> 
     <goal>run</goal> 
    </goals> 
    <configuration> 
     <tasks> 
     <mkdir dir="${project.build.directory}"/> 
     <tstamp> 
      <format property="last.updated" 
      pattern="yyyy-MM-dd hh:mm:ss"/> 
     </tstamp> 
     <echo file="${basedir}/target/ 
    filter.properties" message="build.time=${last.updated}"/> 
     </tasks> 
    </configuration> 
    </execution> 
</executions> 
</plugin> 

asentando después del POM archivo para usar el archivo de manifiesto predeterminado

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.2</version> 
    <configuration> 

     <useDefaultManifestFile>true</useDefaultManifestFile> 

     <!-- 
     <archive> 
      <index>true</index> 
       <manifest> 
       <addClasspath>true</addClasspath> 
       <addDefaultImplementationEntries>true 
       </addDefaultImplementationEntries> 
       <addDefaultSpecificationEntries>true 
       </addDefaultSpecificationEntries> 
      </manifest> 

      <manifestEntries> 
       <Built-By>${user.name}</Built-By> 
       <Build-Jdk>${java.version}</Build-Jdk> 
      </manifestEntries> 
     </archive> 
     --> 
    </configuration> 

</plugin> 

Luego, MANIFEST.MF generado en el archivo jar se verá así.

Manifest-Version: 1.0 
Archiver-Version: Plexus Archiver 
Created-By: Apache Maven 
Built-By: admin 
Build-Jdk: 1.5.0_14 
Specification-Title: App Name 
Specification-Version: 0.1 - 2008-02-21 01:03:13 
Specification-Vendor: Company Name 
Implementation-Title: App Name 
Implementation-Version: 0.1 - 2008-02-21 01:03:13 
Implementation-Vendor: Company Name 
Build-Time: 2008-02-21 01:03:13 

Recursos


para ANT

<?xml version="1.0"?> 

<project name="tstamp" basedir="." default="jar"> 
    <property name="src" value="src"/> 
    <property name="obj" value="obj"/> 
<property name="jar" value="tstamp"/> 

<target name="clean"> 
    <delete file="${jar}.jar"/> 
    <delete dir="${obj}"/> 
    <delete dir="${doc}"/> 
</target> 

    <target name="compile"> 
     <javac srcdir="${src}" destdir="${obj}" source="1.4" debug="true" 
deprecation="true" /> 
    </target> 

    <target name="jar" depends="compile"> 
    <tstamp/> 
     <jar jarfile="${jar}-${DSTAMP}${TSTAMP}.jar" compress="true"> 
    <fileset dir="${obj}" includes="**/*"/> 
    <fileset dir="${src}" includes="**/*"/> 
     </jar> 
    </target> 
</project> 
The above build.xml outputs a jarfile named 'tstamp-200307011540.jar' 

Recursos

46

Hay una solución experta mucho más simple que no requiere el plugin antRun. Maven tiene una variable especial maven.build.timestamp (desde Maven 2.1.0-M1).

<plugin> 
    <artifactId>maven-war-plugin</artifactId> <!-- or maven-jar-plugin --> 
    <version>2.2</version> 
    <configuration> 
     <archive> 
      <manifestEntries> 
       <Build-Time>${maven.build.timestamp}</Build-Time> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 

Esto producirá una línea "Build-Time: yyyyMMdd-HHmm". El formato se puede personalizar con:

<properties> 
    <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format> 
</properties> 

El patrón debe cumplir con el formato de SimpleDateFormat.

Referencia: Maven Documentation

+2

Funciona para archivos jar también. ¡Bonito! – Snekse

+0

¡Muy bien! Gracias –

+2

Sugiero también https://stackoverflow.com/a/3403426/5580181 para leer el archivo –

0

normalmente siguen este enfoque alternativo para el manifiesto, ya que es de fácil acceso desde cualquier punto de nuestras aplicaciones.

package com.livngroup.sandbox; 

import java.io.File; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.Iterator; 

import org.apache.commons.io.FileUtils; 
import org.joda.time.DateTime; 

public enum Versioning { 

    INSTANCE; 

    public final DateTime buildTime; 

    private Versioning() { 
     this.buildTime = this.getLastModifiedDate(); 
    } 

    private DateTime getLastModifiedDate() { 
     try { 
      return new DateTime(this.getLastModifiedFile().lastModified()); 
     } catch (Exception e) { 
      try { 
       URLConnection conn = Versioning.class.getResource(Versioning.class.getSimpleName()+".class").openConnection(); 
       return new DateTime(conn.getLastModified()); 
      } catch (Exception e2) { 
       return new DateTime(0L); //Just a fallback 
      } 
     } 
    } 

    private File getLastModifiedFile() { 
     try { 

      URL url = Versioning.class.getResource(Versioning.class.getSimpleName()+".class"); 

      File dir = new File(url.toURI()).getParentFile().getParentFile().getParentFile().getParentFile().getParentFile(); 
      //System.out.println("classes.dir: "+dir); 

      String[] extensions = null; 

      File lastModifiedFile = null; 
      for (Iterator<File> iterator = FileUtils.iterateFiles(dir, extensions, true); iterator.hasNext();) { 
       File file = iterator.next(); 
       if(lastModifiedFile==null || FileUtils.isFileNewer(file, lastModifiedFile)) { 
        lastModifiedFile = file; 
       } 
      } 

      //System.out.println("lastModified: "+lastModified); 

      return lastModifiedFile; 

     } catch (Exception e) { 
      return null; 
     } 
    } 
} 

Obviamente, el tiempo de construcción a continuación, se puede acceder fácilmente como

Versioning.INSTANCE.buildTime 
Cuestiones relacionadas