Я обновил свой ответ.
Используйте maven-jar-plugin, чтобы поместить ваш project.version в MANIFEST.MF встроенного фляги. Поэтому поместите эти строки в плагины Maven:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
Это приведет (помимо прочего) к следующей записи в Манифесте:
Implementation-Version: 0.0.1-SNAPSHOT
Вы можете прочитать его с помощью следующего кода:
package com.javacodegeeks.examples.logbackmavenexample.beans;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyBean {
private static final Logger LOGGER = LoggerFactory.getLogger(MyBean.class);
public static String getManifestInfo() {
try {
// reading all MANIFEST.MF from the classpath: from every jar/META-INF/MANIFEST.MF and every folder/META-INF/MANIFEST.MF and search for ours
Enumeration<URL> resEnum = Thread.currentThread().getContextClassLoader()
.getResources(JarFile.MANIFEST_NAME);
while (resEnum.hasMoreElements()) {
try {
URL url = resEnum.nextElement();
InputStream is = url.openStream();
if (is != null) {
Manifest manifest = new Manifest(is);
Attributes mainAttribs = manifest.getMainAttributes();
// artifactId will be mapped to Implementation-Title
// so we can use it to identify our manifest file
if (!"logbackmavenexample".equals(mainAttribs.getValue("Implementation-Title"))) {
continue;
}
// found! return the version
String version = mainAttribs.getValue("Implementation-Version");
if (version != null) {
return version;
}
}
} catch (Exception e) {
// Silently ignore wrong manifests on classpath?
}
}
} catch (IOException e1) {
// Silently ignore wrong manifests on classpath?
}
return null;
}
public static void main(String[] args) {
LOGGER.info("{} started", MyBean.class.getName());
// to print out the version ONLY without timestamp, classname, etc. I suggest to use sysout
System.out.println(getManifestInfo());
// however I would use this form:
LOGGER.info("Version: {}", getManifestInfo());
}
}
Я немного изменил ваш logback.xml (я добавил additivity = "false" , чтобы предотвратить дублирование строк журнала, когда этот регистратор и корневой регистратор активны одновременно):
<logger name="com.javacodegeeks.examples.logbackmavenexample.beans" level="INFO" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
Еще одна вещь, которую я заметил, что вы указали здесь более высокий уровень журнала (INFO), чем в корневом логгере (там вы указали DEBUG). Это привело к тому, что моя первая попытка ничего не регистрировала, потому что я использовал уровень DEBUG при вызове указанного регистратора в MyBean. Обычно это настраивается в обратном порядке, мы хотим, чтобы все регистрировалось только в INFO, а некоторые конкретные (в стадии разработки / критические части) пакеты - это журналы с DEBUG / TRACE и т. Д.