Отображение метки времени сборки в приложении - PullRequest
17 голосов
/ 23 октября 2010

Я хотел бы отобразить отметку времени, когда приложение было встроено в окно about. Это позволит мне отслеживать разные версии приложения. Как я могу получить эту информацию на Java?

Ответы [ 4 ]

53 голосов
/ 14 августа 2012

Существует гораздо более простое решение maven, которое не требует плагина antrun. Maven имеет специальную переменную maven.build.timestamp (начиная с 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>

В результате будет получена строка «Время сборки: ггггМмдд-ЧЧмм». Формат можно настроить с помощью:

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

Шаблон должен соответствовать формату SimpleDateFormat.

Ссылка: Документация Maven

7 голосов
/ 23 октября 2010

Вы должны указать процессу сборки, чтобы метка времени была помещена в файл свойств Java, из которого ваше приложение может затем прочитать его.Другим хорошим вариантом для этого будет файл манифеста jar.

Для ant вы хотите использовать свойства tstamp и tasks, см. для этогопример .

Пока вы на нем, вы также можете включить номер версии управления версиями.

2 голосов
/ 23 октября 2010

для Maven :

В файле pom.xml добавьте следующее

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

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

используйте плагин Maven AntRun для генерации времени сборки,

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

Затем настройте файл pom на использование файла манифеста по умолчанию

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

Тогда сгенерированный файл MANIFEST.MF в файле jar будет выглядеть следующим образом.

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  

Ресурсы


для 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'  

Ресурс

0 голосов
/ 28 февраля 2018

Обычно я придерживаюсь этого альтернативного подхода к MANIFEST, так как он легко доступен из любого места в наших приложениях.

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
...