В Java, как я могу включить информацию о динамической версии в файл журнала? - PullRequest
4 голосов
/ 06 августа 2009

Из приложения Java я могу записать строку, используя пользовательскую структуру ведения журнала, следующим образом:

logger.info("Version 1.2 of the application is currently running");

Поэтому, когда пользователь отправляет мне файл журнала, я легко вижу, какую версию приложения он запускает.

Проблема с кодом выше заключается в том, что версия жестко закодирована в строковом литерале, и кто-то должен помнить, чтобы обновлять ее для каждого выпуска. Вполне неизбежно, что обновление этой строки может быть забыто для релиза.

Я бы хотел, чтобы этот строковый литерал автоматически обновлялся на основе одного из номеров версий в файле манифеста для JAR приложения:

Specification-Version: 1.2
Implementation-Version: 1.2.0.0

Я не против, если это произойдет во время компиляции или во время выполнения, пока номер версии попадает в файл журнала.

Ответы [ 3 ]

4 голосов
/ 06 августа 2009

Стандартный способ получения этой информации: SomeClass.class.getPackage().getImplementationVersion().

Нет необходимости выполнять какой-либо синтаксический анализ самостоятельно.

0 голосов
/ 06 августа 2009

, чтобы вы могли загрузить ваш / META-INF / MANIFEST во время выполнения, используя ClassLoader. Затем загрузите и проанализируйте Implementation-Version:

String welcome = String.format("Version %s of the application is currently running",
                          implementationVersion);
logger.info(welcome);
0 голосов
/ 06 августа 2009

Вы можете загрузить манифест во время выполнения, используя следующий класс

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");

и затем включите проанализированную версию в оператор журнала

logger.info("Version " + specificationVersion + " of the application is currently running");

Подробнее см. в спецификации файла Jar .

...