【发布时间】:2011-09-30 11:16:20
【问题描述】:
我们有一个库,每隔几周就会以不同的版本号发布。问题是为了将版本号存储在我们的 jar 中,我们有一个 version.txt 文件,它只包含版本号,然后被包含到构建中。这似乎是错误的方法,但我想不出更好的解决方案。有什么更好的方法将版本号存储在我们的 jar 中,这样如果用户打电话给我,我可以很容易地找到他们正在使用的我们产品的版本?
【问题讨论】:
标签: java jar versioning
我们有一个库,每隔几周就会以不同的版本号发布。问题是为了将版本号存储在我们的 jar 中,我们有一个 version.txt 文件,它只包含版本号,然后被包含到构建中。这似乎是错误的方法,但我想不出更好的解决方案。有什么更好的方法将版本号存储在我们的 jar 中,这样如果用户打电话给我,我可以很容易地找到他们正在使用的我们产品的版本?
【问题讨论】:
标签: java jar versioning
您是指用户手动访问,还是从 Java 应用程序访问?您可以创建一个包含版本号的 MANIFEST.MF。我认为每个主要的构建工具都有一些工具可以在构建过程中自动完成。
【讨论】:
首先——确保你的程序或工具可以显示版本号。但它来自哪里?我们将它包含在构建中。
只要确保它在运行时在某个地方可见!如果没有可运行的内容,请添加一个 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 文件,这是另一堆代码,但足够简单。
【讨论】:
【讨论】:
我和 Reupke 一起做这个。
将数字存储在属性文件或 txt 文件中,以纯文本、加密、嵌入式 DB 的方式存储。只要你有它,不管你如何存储它。
然后,我会编写一个带有 main 方法的类,该方法读取中的值并将其很好地打印到屏幕上......这样,如果用户想知道他们的版本号,那么可以简单地运行命令并获取这个版本.
【讨论】: