2009-08-06 5 views
4

Java에서 어떻게 동적 버전 정보를 로그 파일에 포함시킬 수 있습니까?

Java 응용 프로그램에서 다음과 같이 사용자 정의 로깅 프레임 워크를 사용하여 문자열을 기록 할 수 있습니다.

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

따라서 사용자가 로그 파일을 보내면 실행중인 응용 프로그램의 버전을 쉽게 볼 수 있습니다.

위의 코드의 문제점은 버전이 문자열 리터럴에 하드 코드되어 누군가가 모든 릴리스에 대해 버전을 업데이트해야한다는 것을 기억해야한다는 것입니다. 이 문자열을 업데이트하는 것이 릴리스에 대해 잊어 버릴 수 있음은 상당히 피할 수없는 일입니다.

응용 프로그램의 JAR에 대한 매니페스트 파일의 버전 번호 중 하나를 기반으로이 문자열 리터럴이 자동으로 업데이트됩니다.

Specification-Version: 1.2 
Implementation-Version: 1.2.0.0 

이 문제가 컴파일시 발생하면 괜찮습니다. 런타임 또는 버전 번호가 로그 파일에있는 한.

답변

4

정보를 얻을 수있는 표준 방법은 SomeClass.class.getPackage().getImplementationVersion()입니다.

독자적으로 구문 분석 할 필요가 없습니다.

+0

이유는 모르겠지만이 경우 null이 반환됩니다. 생성 된 JAR에서 매니페스트를 확인했으며 버전 정보를 가지고 있습니다. 어떤 아이디어? – Iain

+0

물론 "SomeClass"는 해당 병에서로드해야합니다. –

+0

SSCCE (http://sscce.org/)를 제공 할 수 있습니까? –

0

당신은

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

자세한 내용은 the Jar file specification을 참조하십시오.

+0

약간의 실수. 자원 이름의 시작 부분에 슬래시가 없습니다. getClass(). getResourceAsStream ("/ META-INF/MANIFEST.MF"); – Iain

+0

고침. 고마워. –

+0

사실 재미있는 일이 있습니다. Java API Manifest : Manifest & Iain

-1

그래서 ClassLoader를 사용하여/META-INF/MANIFEST를 런타임에로드 할 수 있습니다. 그런 다음로드 Implementation-Version을 구문 분석 :

String welcome = String.format("Version %s of the application is currently running", 
          implementationVersion); 
logger.info(welcome); 
+0

ClassLoader의 사용을 보여주는 실제 코드 예제가 더 유용 할 것입니다. 실제 문자열 형식 명령은 ClassLoader 사용 방법을 모른 채 유용하지 않습니다. –

관련 문제