如何向用户显示Java Swing应用程序的版本号?

时间:2016-10-27 12:20:57

标签: java swing gradle jar

我有一个Swing GUI应用程序。我想要一个传统的“关于”对话框,向用户显示一些版权信息和应用程序版本。

我们的构建系统(基于Gradle)已经跟踪版本,源树中有一个包含major + minor +补丁版本号的属性文件。

让Gradle生成一个文本文件(或使用现有的属性文件)会非常容易,该文件随应用程序一起安装。显示“关于”框时,应用程序可以从文件中读取。我想避免这种情况,因为我不喜欢用户能够修改该文件的想法。

也许构建可以将版本硬编码到构建的Jar中?

或者我的应用程序可能会以某种方式读取Jar文件'Manifest中的数据?在Gradle中更新MANIFEST.MF很简单。

我认为很多其他人必须先解决这个问题,但我在谷歌或StackOverflow上找不到任何可以解决这个问题的方法。理想情况下,我正在寻求就最佳实践达成共识

3 个答案:

答案 0 :(得分:3)

使用ClassLoader.getResourceAsStream("/META-INF/MANIFEST.MF")打开清单文件然后解析出您需要的内容会很容易。这可以在jar文件中工作。

答案 1 :(得分:1)

只是一个想法,但是......

在构建过程中,您可以运行外部shellcript来替换其中一个类的源代码。它将版本作为参数(来自Gradle)并在您的源代码中对其进行硬编码。然后,它将被编译。

写起来不应该太难。希望有所帮助。

答案 2 :(得分:0)

由于我想显示自定义属性(CopyrightYear),我无法使用Package API's方法自动获取当前Jar的属性。

使用Gradle将正确的数据放入我的jar文件' s Manifest是一件容易的事:

jar {
    manifest {
        attributes("Version": project.version, "CopyrightYear": new Date().format("yyyy"))
    }
}

this answer

改编了从中检索属性的java代码
private Attributes getMyManifestAttributes() throws IOException {
    String className = getClass().getSimpleName() + ".class";
    String classPath = getClass().getResource(className).toString();
    if (!classPath.startsWith("jar")) {
        throw new IOException("I don't live in a jar file");
    }
    URL url = new URL(classPath);
    JarURLConnection jarConnection = (JarURLConnection) url.openConnection();
    Manifest manifest = jarConnection.getManifest();
    return manifest.getMainAttributes();
}

使用ClassLoader将清单定位为资源,结果是向我提供了所有依赖项jar的Manifest文件,但不是我自己的。去搞清楚。而且,它需要更多的代码来迭代各种资源。