【问题标题】:Check version of running JAR Linux service检查运行 JAR Linux 服务的版本
【发布时间】:2019-01-31 03:07:10
【问题描述】:

我有一个运行 JAR 的 initctl 服务,我需要确保在更新代码后重新启动它。

我知道我可以写一个带有版本的文本文件并检查它,但我想知道是否有一种方法可以构建一个带有版本标签的 JAR,我可以在使用 initctl status ServiceNameHere 时查看它?

任何更好的选择也会有所帮助!

【问题讨论】:

  • 你是如何制作 jar fly 的?
  • 将版本放在 .jar 文件清单的 Specification-Version 属性中。
  • @aksappy gradle
  • @VGR 但是我将如何使用 initctl 进行检查?
  • 对不起,我还不清楚。你的意思是你需要一个像 _.jar 这样的 jar 文件?

标签: java linux service jar version


【解决方案1】:

正确构建的 .jar 将其版本存储在其清单或模块描述符中。 .jar 文件实际上只是一个 zip 文件,其中包含一个或多个特定于 Java 的特殊条目,其中最重要的是 META-INF/MANIFEST.MF,一个称为清单的纯文本文件,其中包含有关 .jar 文件内容的信息。

可能存在多个standard attributes(尽管允许自定义属性并且实际上很常见)。标准之一是Implementation-Version

因此,要确定 .jar 文件的版本,您可以使用:

unzip -p /path/to/jar META-INF/MANIFEST.MF | sed -n -e 's/^Implementation-[Vv]ersion: //p'

如果您的 .jar 文件是 Java 9+ 模块,则清单属性将被忽略,因此上述内容将不起作用。在这种情况下,您需要提取模块描述符:

jar -d -f /path/to/jar | sed -n -e 's/^[^@]*@\([^ ][^ ]*\).*/\1/p'

要检查您要运行的 .jar 是否与上次运行的 .jar 具有相同的版本,请将其存储在 /var 下的某个位置。例如:

versionfile=/var/local/last_jar_version

version=`unzip -p /path/to/jar META-INF/MANIFEST.MF | sed -n -e 's/^Implementation-[Vv]ersion: //p'`
# For modules: version=`jar -d -f /path/to/jar | sed -n -e 's/^[^@]*@\([^ ][^ ]*\).*/\1/p'`

if [ -f "$versionfile" && "$version" = `cat "$versionfile"` ]
then
    echo Running same version of jar as last time.
else
    echo Running a different jar version: "$version"
fi

printf %s "$version" > "$versionfile"

极端情况:由于a line in a manifest may not be longer than 72 bytes (not characters),对于长度超过 48 个 ASCII 字符的非模块 jar 版本,这将失败。 (Implementation-Version: 是 24 字节,并且 72 - 24 = 48。)我从来没有见过这么长的,但我怀疑它们在那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2012-04-15
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多