Отпечаток файла WAR Java
Я пишу JAR-библиотеку, которая может быть включена в любой WAR-файл, отправляя данные журнала на сервер (EDIT: это приложение для Log4j). Чтобы позже сгруппировать журналы, которые исходили из одной и той же версии приложения, но пришли с разных серверов, я хочу сгенерировать отпечаток пальца / контрольную сумму для WAR.
Я думал об использовании элементов classpath и размеров файлов - но просто не могу понять, как лучше.
Как бы вы это сделали?
4 ответа
Боюсь, что единственный приемлемый ответ: это невозможно без безответственных, мерзких взломов.
Вы можете найти, с некоторым отклонением для контейнеров, местоположение файла для JAR в WAR (может быть, разархивировано) следующим образом:
. AClassInTheJar.class.getProtectionDomain() getCodeSource() getLocation() GetPath()..;
Очевидно, что это предшествует дактилоскопии.
Ну, криптографический хеш файла, вероятно, является наиболее общим решением. И, на самом деле, если файл подписан, хэш уже существует, в форме подписи. (Вам не нужно "проверять" подпись, просто признайте, что это "уникальный" идентификатор, который может один или два раза в эпоху вселенной не быть действительно уникальным.)
Если файл не подписан, вы все равно можете (умеренно) легко вычислить хеш, используя java.security.MessageDigest.
Почему бы вам не создать хеш-сумму MD5 из файла WAR, который реализован в Java SE:
byte[] warBytes;
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(warBytes);
byte[] hash = digest.digest();
Обратитесь к быстрой реализации MD5 в Java и Java SE API.