Правильно созданный .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). Я никогда не видел такой длинный, но я подозреваю, что они там.