我的 NetBeans java 应用程序如何显示其构建时间?

How can my NetBeans java app display the time it was built?

我对 Java 应用程序编程比较陌生。我正在寻找一种方法,将应用程序的构建时间嵌入到应用程序的“关于”对话框中。它不需要花哨或采用任何特定格式,但确实需要针对每个构建进行更改。对于 C 项目,我会使用 DATETIME 预处理器宏。

我试过了

    private void helpAboutMenuActionPerformed(java.awt.event.ActionEvent evt) {                                              
        // TODO add your handling code here:

        // Trying to launch an About dialog
        versionString = versionString.format( "Compiled on %s", compileTime );

        System.out.println( "Version Info is: " + versionString );
        System.out.println( "this.revision is: " + this.compileTime);

        helpAboutDialog.showMessageDialog( helpAboutDialog, 
                versionString + "\r\n" + this.compileTime,  // Message info
                "Version Info",
                helpAboutDialog.INFORMATION_MESSAGE );


    } 

其中定义了 compileTime

    public class mainWindow extends javax.swing.JFrame {

    /**
     * Creates new form mainWindow
     */
        public final Date  compileTime = new Date();

然后我选择了 "Clean and Build" 和 运行 .jar 文件。显示的时间是我运行.jar文件的时间;当我关闭应用程序并 运行 几分钟后显示的时间不同。因为我只是 运行 .jar 文件,所以我认为时间应该是相同的。

我的构建环境是 Netbeans 7.4 和内置的 GUI 构建器(我不知道它的正确名称)。

有什么建议吗?如有必要,我可以尝试构建一个完整的应用程序来显示问题(我的实际源文件有 800 多行并且还在增长——其中大部分与此无关problem/issue)。

我接下来的想法是尝试在文件系统中找到.jar 文件并请求该文件的最后修改时间。只是为了获得一个版本号需要经历很多,但我知道我会在发布后收到支持请求,我真的很想知道确切的代码是什么 运行。根据我的经验,手动修改的版本号通常会在代码 fixes/updates 期间被遗忘。

更新:更改为使用 jar 文件 Xxx.class 条目时间戳,而不是 jar 文件自上次修改以来的 jar 文件自己的时间戳部署时可能会更新日期。

可以使用以下代码获取.class文件的文件修改时间,如果运行直接从文件系统获取,如果打包则从jar文件入口获取。

Class<?> myClass = Test.class; // or getClass() if in non-static method
String classFileName = myClass.getSimpleName() + ".class";
URL classUrl = myClass.getResource(classFileName);
FileTime modifiedTime;
if (classUrl != null && "file".equals(classUrl.getProtocol())) {
    modifiedTime = Files.getLastModifiedTime(Paths.get(classUrl.toURI()));
} else if (classUrl != null && "jar".equals(classUrl.getProtocol())) {
    JarURLConnection connection = (JarURLConnection) classUrl.openConnection();
    modifiedTime = connection.getJarEntry().getLastModifiedTime();
} else {
    throw new IllegalStateException("Unable to determine build time for '" + classFileName + "'");
}
System.out.println("File '" + classFileName + "' was modified on " + modifiedTime);

当运行直接输出,例如来自 NetBeans

File 'Test.class' was modified on 2020-04-14T01:52:35.2654475Z

从jar文件运行时输出

File 'Test.class' was modified on 2020-04-14T01:52:34Z