Java 在应用程序中显示生成时间戳

Java 在应用程序中显示生成时间戳,java,build,versioning,Java,Build,Versioning,我想在about框中显示应用程序构建的时间戳。这将允许我跟踪应用程序的不同版本。如何在Java中检索这些信息?您需要告诉构建过程将时间戳放入Java属性文件中,然后应用程序可以从中读取时间戳。另一个很好的选择是jar清单文件 对于ant,如果要使用和任务,请参阅 在编写时,您可能还希望包含源代码管理修订号。对于Maven: 在pom.xml文件中,添加以下内容 <resources> <resource> <directory>src/main/r

我想在about框中显示应用程序构建的时间戳。这将允许我跟踪应用程序的不同版本。如何在Java中检索这些信息?

您需要告诉构建过程将时间戳放入Java属性文件中,然后应用程序可以从中读取时间戳。另一个很好的选择是jar清单文件

对于ant,如果要使用和任务,请参阅


在编写时,您可能还希望包含源代码管理修订号。

对于Maven

在pom.xml文件中,添加以下内容

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

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


对于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'  

上面的build.xml输出一个名为“tstamp-200307011540.jar”的jar文件
资源


    • 有一个更简单的maven解决方案,它不需要antrun插件。Maven有一个特殊的变量Maven.build.timestamp(自Maven 2.1.0-M1以来)

      
      

      我通常采用这种替代方法来处理清单,因为这很容易从应用程序中的任何位置访问

      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;
              }
          }
      }
      

      您使用的是哪种构建工具?在NetBeans构建环境中有没有办法做到这一点?@JackN NB同时使用ant和maven。这取决于您使用的构建工具。在简单的NB项目中,它使用ANT,因此请遵循ant@org.life.java我将eclipse与JDK1一起使用。3@Artium应该有一个build.xml文件,请检查该文件。并参考ant的解决方案。如果不存在,请告诉我们除了属性文件之外,我更喜欢将构建编号和编译时间作为源代码的一部分放在版本类中,并使用它来报告。属性文件往往被复制到新的安装中,因此可能会报告错误的版本。(这样,如果属性文件中的内部版本号!=编译后的内部版本号,则应用程序可以记录。)显式将其放入一个文件。如果文件稍后重新打包,仅读取文件的时间戳就会中断。“属性文件倾向于复制到新安装,因此可能会报告错误版本。”这些文件应最终位于jar文件中。没有人打扰他们(如果他们这样做了,那就是他们的问题)。在这个例子中,他们没有说明如何读取Build Date属性。。。你知道如何从java代码中读取这些吗?jar文件也适用。美好的很不错的!谢谢,那么您如何从应用程序中访问构建时间戳呢?这个答案显示了大多数人将如何包括它所缺少的版本号,以显示如何从应用程序中访问值。请记住,每个JAR、WAR或EAR都可以有一个清单,因此在一个类路径上有许多清单。
      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  
      
      <?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'  
      
      <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>
      
      <properties>
          <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
      </properties>
      
      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;
              }
          }
      }
      
      Versioning.INSTANCE.buildTime