2010-02-10 4 views
1

Java 응용 프로그램을 빌드하고 있습니다 (build.xml 및 build.property 파일과 함께 Ant 사용). 이제 System.err에 여러 진단 메시지를 출력하는 다른 "디버그"빌드를 만들 수 있기를 바랍니다. 이것은 (간체)이 같은 의해 달성된다Java 응용 프로그램의 다른 빌드 버전 만들기

private static final boolean DEBUG = false; 

public static void debug (String msg) { 
    if (DEBUG) { 
     System.err.println(msg); 
    } 
} 

이 가능 빌드 시간에 DEBUG 상수의 값에 영향을? 내가 뭘 찾고있는 것 같아 C - 전처 리기 정의에 해당하는 자바입니다. 이상적으로는 build.xml 파일에 다른 빌드 대상을 지정하면 DEBUG를 true로 설정하고 myapp-debug.jar을 출력으로 생성합니다.

이와 관련하여 응용 프로그램이 사용하는 구성 파일의 이름이 사용됩니다. 이것은 또한 소스 코드에서 정적 상수로 지정되어 있지만 빌드시 조정 가능하도록하는 것이 좋습니다. 이 모든 당신에게 명백한 경우

미안 해요, 전문가 : 아니에요

+0

다중 빌드에 대한 요구 사항은 무엇입니까? 런타임에 DEBUG를 켜거나 끌 수있는 빌드를 하나만 만들면 어떨까요? –

답변

2

.properties 구성 파일을 통해 로깅 옵션을 제어하는 ​​것은 드문 일은 아닙니다.

로드 속성 파일을 읽을 수 있고로드가 성공하면 (파일을 필수 파일로 만들 필요는 없도록) 로깅을 제어하는 ​​속성을 사용하십시오.

+0

오, 죄송합니다. 나는이 질문에 대답하는 동안 비슷한 대답을 올렸습니다 .... 중복을 유감스럽게 생각합니다. – fasseg

+0

저는 여러분이 옳다고 생각합니다 : 속성 파일은 갈 길입니다. 나는이 문제가 한 레벨 씩 밖에 푸시하지 않는다는 잘못된 인상을 받았다. 왜냐하면 속성 파일의 이름/위치를 하드 코딩했기 때문에 클래스 패스에서 찾을 수 있다는 것을 기억했다. (응용 프로그램 JAR이있는 경우이를 포함하여). 감사! – Zilk

1

그래서 javac는 전처리가 있고하지 않습니다, "한 번 구축 어디에서나 실행"의 원칙에 자바의 빌드 변수의 단일 정의를 어딘가에 가지고 컴파일하는 것보다 다른 방법으로 컴파일 할 때 변수를 변경할 수 없으며 컴파일 전에 소스 파일에서 변수를 변경해야합니다.

로깅 목적으로 만 이것을 수행하는 경우 java.util.logging 패키지를 조사해야합니다. 프로덕션 환경에서 실행 중지 할 수있는 특정 컨트롤을 런타임에 수행하려면 Java assertions에 대한 정보를 확인하십시오.

1

자바 속성 텍스트 파일에 변수를 외부화하는 것이 더 쉬울 것이라고 생각합니다. 그런 다음 * .property 파일이나 XML 파일에서 정의 된 속성을로드하고 응용 프로그램 논리를이 속성에 의존하게 할 수 있습니다. application.properties 파일이 같은

뭔가 :

application.log.level=DEBUG 

다음 속성 클래스의 load() 메서드를 사용하여로드됩니다

Properties props = new Properties(); 
props.load(new FileInputStream("application.properties")); 
String debugLevel=props.getProperty("application.log.level"); 
boolean debug; 
if (debugLevel!=null && debugLevel.equals("DEBUG")) { 
    debug=true; 
} 
6

나는 경우 log4j을 권 해드립니다 이것이 유일한 문제입니다.

데이터베이스 및 대기열 연결과 같은 기타 설정이있을 수 있습니다. 환경에 따라 다를 수있는 구성으로 모두 외부화해야합니다.

+0

또는 그 의도 된 후속 로그백 : http://logback.qos.ch (+1). – BalusC

관련 문제