В Java, как я могу включить информацию о динамической версии в файл журнала?
Вопрос
Из приложения Java я могу записать строку, используя пользовательскую платформу ведения журнала, следующим образом:
logger.info("Version 1.2 of the application is currently running");
Поэтому, когда пользователь отправляет мне файл журнала, я могу легко увидеть, какую версию приложения он запускает.
Проблема с приведенным выше кодом заключается в том, что версия жестко запрограммирована в строковом литерале, и кто-то должен помнить об обновлении ее для каждого выпуска.Довольно неизбежно, что обновление этой строки может быть забыто для выпуска.
Что я хотел бы сделать, так это автоматически обновить этот строковый литерал на основе одного из номеров версии в файле манифеста для JAR приложения:
Specification-Version: 1.2
Implementation-Version: 1.2.0.0
Я не возражаю, если это произойдет во время компиляции или во время выполнения, пока номер версии попадает в файл журнала.
Решение
Стандартным способом получения этой информации является SomeClass.
class
.
getPackage()
.
getImplementationVersion()
.
Нет необходимости выполнять какой-либо синтаксический анализ самостоятельно.
Другие советы
Вы можете загрузить манифест во время выполнения, используя следующий класс
public class ManifestFinder {
private final Class<?> _theClass;
public ManifestFinder(Class<?> theClass) {
_theClass = theClass;
}
public Manifest findManifest() throws MalformedURLException, IOException {
String className = _theClass.getSimpleName();
String classFileName = className + ".class";
String pathToThisClass = _theClass.getResource(classFileName).toString();
int mark = pathToThisClass.indexOf("!");
String pathToManifest = pathToThisClass.toString().substring(0, mark + 1);
pathToManifest += "/META-INF/MANIFEST.MF";
return new Manifest(new URL(pathToManifest).openStream());
}
}
проанализируйте данные из манифеста ( непроверенные )
String specificationVersion = manifest.getMainAttributes().getValue("Implementation-Version");
а затем включите проанализированную версию в инструкцию log
logger.info("Version " + specificationVersion + " of the application is currently running");
Видишь спецификация файла Jar для получения более подробной информации.
таким образом, вы можете загрузить свой /META-INF/MANIFEST во время выполнения, используя ClassLoader .Затем загрузите и проанализируйте Implementation-Version
:
String welcome = String.format("Version %s of the application is currently running",
implementationVersion);
logger.info(welcome);