检查运行JAR Linux服务的版本

问题描述 投票:0回答:1

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

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

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

java linux service jar version
1个回答
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.)我从未见过那么长,但我怀疑他们在那里。

© www.soinside.com 2019 - 2024. All rights reserved.