【问题标题】:How to insert version numbers in our java jars, that a user can access?如何在我们的 java jar 中插入用户可以访问的版本号?
【发布时间】:2011-09-30 11:16:20
【问题描述】:

我们有一个库,每隔几周就会以不同的版本号发布。问题是为了将版本号存储在我们的 jar 中,我们有一个 version.txt 文件,它只包含版本号,然后被包含到构建中。这似乎是错误的方法,但我想不出更好的解决方案。有什么更好的方法将版本号存储在我们的 jar 中,这样如果用户打电话给我,我可以很容易地找到他们正在使用的我们产品的版本?

【问题讨论】:

    标签: java jar versioning


    【解决方案1】:

    您是指用户手动访问,还是从 Java 应用程序访问?您可以创建一个包含版本号的 MANIFEST.MF。我认为每个主要的构建工具都有一些工具可以在构建过程中自动完成。

    【讨论】:

    • 两者都很好,但最重要的是,如果用户打电话给我并拥有我们的 jar,我希望能够告诉他们看这里或运行它,它会给我版本号.
    【解决方案2】:

    首先——确保你的程序或工具可以显示版本号。但它来自哪里?我们将它包含在构建中。

    只要确保它在运行时在某个地方可见!如果没有可运行的内容,请添加一个 Main,并将其设为 Main-Class,它只打印版本。然后你可以说,请输入java -jar YourLibrary.jar,它只会运行 main 并打印你的版本。

    如果资源(例如 Version.txt)在 klazz 旁边,以下是从 jar 中读取资源的代码开头:

    ClassLoader loader = klazz.getClassLoader();
    InputStream in = loader.getResourceAsStream (name);
    

    我喜欢在每次构建时让它自动运行,所以我不会忘记调整它。我使用 .properties 而不是文本文件,但您可以在 Version.txt 中做同样的事情。

    (实际上,目前我们只包括构建时间。但想法是一样的。)

    我是这样做的——我有一个 Version.properties 文件,其中包含:

    buildHost = @HOSTNAME@
    buildTime = @BUILDTIME@
    buildUser = @USERNAME@
    

    作为 ANT 脚本的一部分,我们这样做:

    <tstamp>
        <format property="BUILDTIME" pattern="yyyy.MM.dd.HH:mm:ss z" locale="en,UK" />
    </tstamp>
    
    <exec executable="hostname" outputproperty="HOSTNAME">
        <!-- note, this is unixey, of course -->
        <arg value="-s" />
    </exec>
    
    <property environment="env"/>
    <property name="USERNAME" value="${env.USER}"/>
    <property name="build.info" value="path/to/Version.properties" />
    <copy file="${build.info}" tofile="${obj.dir}/${build.info}" overwrite="true">
        <filterchain>
            <replacetokens>
                <token key="BUILDTIME" value="${BUILDTIME}"/>
                <token key="HOSTNAME" value="${HOSTNAME}"/>
                <token key="USERNAME" value="${USER}"/>
            </replacetokens>
        </filterchain>
    </copy>
    

    注意——以上内容有点特定于平台,但你明白了。

    以及您如何阅读 .properties 文件,这是另一堆代码,但足够简单。

    【讨论】:

    • 您好,我的应用程序是由 Jenkins 构建的,我想要 jar 文件中的版本号和内部版本号,我该怎么做?非常感谢。
    【解决方案3】:
    1. 考虑为自己编写一个读取 txt 文件的小类。 (更好的是,按照 David 的建议切换到属性文件。)
    2. 给它一个在控制台上打印该版本的主要方法。
    3. 创建一个 shell 脚本或批处理文件,将 .jar 放在类路径中并调用您的类。
    4. 然后,在您的构建过程中,让您的构建系统将当前的构建号/版本/时间戳插入该文件。对于 ant,请参阅 Davids 示例,对于 Maven,我推荐 Maven Build Number plugin
    5. 当您需要查看 .jar 文件的版本时,请运行您的脚本。

    【讨论】:

      【解决方案4】:

      我和 Reupke 一起做这个。

      将数字存储在属性文件或 txt 文件中,以纯文本、加密、嵌入式 DB 的方式存储。只要你有它,不管你如何存储它。

      然后,我会编写一个带有 main 方法的类,该方法读取中的值并将其很好地打印到屏幕上......这样,如果用户想知道他们的版本号,那么可以简单地运行命令并获取这个版本.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-29
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-28
        • 2013-10-24
        相关资源
        最近更新 更多