2017-03-16 3 views
4

// 업데이트 1 : 나는 좀 더 테스트를했던 libs와의 대부분을 제거하고 동일한 결과 lib에 특정 코드를 주석LogManager.getLogger는 ~ 10 ~ 30 초 동안 응용 프로그램 포장 마차 :

이 문제는 (직접적으로) libs에 의한 것이 아니라 내 코드 및/또는 설정의 일반적인 문제인 것처럼 보입니다.

주요한 문제는 Eclipse가 즉시 실행될 때 (즉, 즉시 시작, 고성능 등) 실행되는 이유를 이해하지 못한다는 것입니다. 동일한 JDK를 사용하는 실행 가능한 JAR로!).

어떤 차이가있을 수 있습니까?

// UPDATE의 END 1

// 원래의 게시물 :

날 여기에 의해 요구 이전 질문에서 오는 :는 관련이없는 것으로 Wrapped .exe with launch4j and jdk8 takes very long to start. Using jdk7 instead starts almost instant

지금 내가 아는 jdk8과 함께 launch4j하지만 그것은 내 응용 프로그램에서 jdk8의 조합 log4j로 인한 것 같습니다. 유사한 문제가 여기에서 논의되었습니다 : Log4j 2 hangs when creating logger 및 여기 : log4j LogManager.getLogger get's stuck in an infinite loop.

그러나 해결책 중 어느 것도 나를 위해 작동하지 않습니다. 문제는 나에게도 조금 다르다. 여기에 우리가 간다 :

메인 응용 프로그램의 기본 메서드는 이전의 로그 파일을 정리하는 등의 로거 개체를 초기화하기 전에 몇 가지 초기화 작업을 수행합니다. 각 단계는 System.out.println을 통해 디버깅 목적으로 인쇄됩니다. 이클립스 내에서 코드를 실행 (또는 디버그 실행 구성은 중요하지 않음) immedeate 출력 (시작 끝내지 < 1 초) 예상대로

public class MyTestCase { 
    private static Logger logger; 

    public static void main(String[] args) throws Exception { 
     System.out.println("Executing MyTestCase..."); 

     doInitstuff1(); 

     doInitstuff2(); 

     System.out.println("Initializing Logger...");  

     logger = LogManager.getLogger(MyTestCase.class.getName()); 

     System.out.println("Init complete!"); 

     doTheRealStuff(); 
    } 

    private void doInitstuff1() { 
     System.out.println("Init Stuff 1..."); 
    } 

    private void doInitstuff2() { 
     System.out.println("Init Stuff 2..."); 
    } 

    private void doTheRealStuff() { 
     System.out.println("Launching GUI..."); 
    } 
} 

된다 : 여기서 감소 된 예이다

MyTestCase 실행

...

초기화 재료 1 ...

초기화 물건 2 ...

로거 초기화 중 ...

초기화 완료!

시작 GUI ...

나는 runable JAR 또는 (l4j 포함) 포장 .EXE를 만들

및 대상 플랫폼에 설치된 JDK 나 JRE 8 응용 프로그램을 실행 결과는 이것이다 :

실행 MyTestCase ...

초기화 물건 1 ...

초기화 물건이 ...

초기화 로거 ... 장치 <에 따라 ~ 10-45초에 대한

응용 프로그램 중지/포장 마차 - 이것은 실제 문제입니다!

초기화 완료!

시작 GUI ...

내가 정확히 JDK 7은 "배치"실행에 대해 컴파일 같은 일이 빨리 이클립스 내에서 같은 출시 할

. 이것은 정말로 이상하고 나는 그것에 대항 할 아무런 단서가 없습니다.

CJWizards - 0.22

평민 - 코덱 - 1.10

공유지-IO-2.4

평민 - lang3- : 테스트 목적으로 & 실험에 사용

내 buildpath/라이브러리 3.4

commons-logging-1.2

구아바-20.0

iText를-2.1.7

JDatePicker-1.3.5

JNA-4.3.0

JNA 플랫폼-4.3.0

의 Log4j -api-2.8.1

log4j-core-2.8.1

,

sl4j-API-1.7.22

SLF4J-NOP-1.7.22

swingx-모든 1.6.5-1

TableLayout을

vlcj 3.10.1-

zip4j_1.3.2

어떤 원인일까요?

요점을 되풀이하다 :이 문제는 (JDK 7 또는 8을 사용하는 경우에 상관없이) JDK 나 JRE 7과 같은 실행 가능한 단지를 실행

  • 을 발생 시킬수 또는를 exe 인하지 않습니다 이클립스 내에서 실행

    • JDK 나 JRE (8)과 같은 실행 가능한 항아리 실행

    • 을 발생 시킬수하거나 문제를 exe 인하지 않는 문제는

    발생 여기

    당신도 필요할 경우를 대비, 내 log4j2.xml 구성 파일의 내용이다 :

    <?xml version="1.0" encoding="UTF-8"?> 
    <configuration status="error"> 
        <appenders> 
         <File name="MyTestCase.debug" fileName="${sys:user.home}/.mtc/log/MyTestCase.debug.log"> 
          <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="ACCEPT"/> 
          <PatternLayout pattern="%d{yyyy-MM-dd | HH:mm:ss.SSS} | [%t] %-5level | %logger{42} | %msg%n"/>    
         </File> 
           <Async name="Async.debug"> 
            <appender-ref ref="MyTestCase.debug"/> 
           </Async>   
         <File name="MyTestCase.error" fileName="${sys:user.home}/.mtc/log/MyTestCase.error.log"> 
          <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> 
          <PatternLayout pattern="%d{yyyy-MM-dd | HH:mm:ss.SSS} | [%t] %-5level | %logger{42} | %msg%n"/>   
         </File> 
           <Async name="Async.error"> 
            <appender-ref ref="MyTestCase.error"/> 
           </Async> 
        </appenders> 
        <loggers>  
         <root level="debug">       
          <appender-ref ref="Async.debug" level="debug"/> 
          <appender-ref ref="Async.error" level="error"/> 
         </root> 
        </loggers> 
    </configuration> 
    
  • +0

    org.apache.log4j.Logger.getLogger (MyTestCase.class)를 사용하여 로거를 초기화하려고 시도 했습니까? – GAlexMES

    +0

    @Ulathar 처음에 2.8.1로 업그레이 드하는 방법에 대해 - 가장 최근에 보았던 것에서 – Eugene

    +0

    @GAlexMES : "Logger org.apache.logging.log4j.LogManager.getLogger (문자열 이름)"사용 중입니다. – Ulathar

    답변

    0

    그것은 동안이었다 그러나이 프로젝트는 JDK 9로 마이그레이션 된 이후 문제는 "해결"한다 JDK 8에서 그 문제가 발생했는지 여부는 여전히 알 수 없지만 JDK 9를 사용하면 사라졌습니다. 따라서이 문제는 "해결 된"것으로 간주됩니다.