Проверьте версию запущенного сервиса JAR Linux - PullRequest
0 голосов
/ 24 августа 2018

У меня есть служба initctl, работающая с JAR, и мне нужно убедиться, что она перезапускается после обновления кода.

Я знаю, что могу просто написать текстовый файл с версией и проверить это, но я былинтересно есть ли способ создать JAR с меткой версии, которую я мог бы просмотреть при использовании initctl status ServiceNameHere?

Любые лучшие альтернативы также были бы полезны!

1 Ответ

0 голосов
/ 28 августа 2018

Правильно созданный .jar хранит свою версию в манифесте или дескрипторе модуля. Файл .jar на самом деле представляет собой просто zip-файл с одной или несколькими специальными записями, специфичными для Java, наиболее важной из которых является META-INF/MANIFEST.MF, простой текстовый файл, известный как манифест, содержащий информацию о содержимом файла .jar.

Существует несколько стандартных атрибутов , которые могут присутствовать (хотя настраиваемые атрибуты разрешены и фактически являются общими). Один из стандартных - 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"

Угловой регистр: поскольку строка в манифесте не может быть длиннее 72 байт (не символов) , это не удастся для немодульных версий jar длиннее 48 символов ASCII. (Implementation-Version: составляет 24 байта, а 72 - 24 = 48). Я никогда не видел такой длинный, но я подозреваю, что они там.

...