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());
}
}
Manifest (Untested)에서 데이터를 구문 분석합니다.
String specificationVersion = manifest.getMainAttributes().getValue("Implementation-Version");
그런 다음 로그 문에 구문 분석 버전을 포함시킵니다.
logger.info("Version " + specificationVersion + " of the application is currently running");
보다 JAR 파일 사양 자세한 사항은.
따라서 클래스 로더를 사용하여 런타임에 /meta-inf /manifest를로드 할 수 있습니다. 그런 다음로드하고 구문 분석하십시오 Implementation-Version
:
String welcome = String.format("Version %s of the application is currently running",
implementationVersion);
logger.info(welcome);
제휴하지 않습니다 StackOverflow