2017-03-16 65 views
4

//更新1:LogManager.getLogger檔應用〜10-30秒:

我做了一些更多的測試,除去大部分的庫的和註釋LIB特定代碼導致同樣的行爲使我得出結論,這個問題不是由這些庫(直接)造成的,但似乎是我的代碼和/或設置中的一個普遍問題。

這裏的主要問題是,我不明白爲什麼它從eclipse(即時啓動,高性能等)中啓動時運行完美,而相同的代碼只要我在eclipse之外啓動時就有所描述的問題作爲使用相同JDK的可運行JAR!)。

有人可以闡明可能存在的差異嗎?

// END OF UPDATE 1

//原貼:

從舊的問題由我在這裏正在添加問道:Wrapped .exe with launch4j and jdk8 takes very long to start. Using jdk7 instead starts almost instant

現在我知道,這是不相關用jdk8啓動4j,但它似乎是由我的應用程序中的log4j與jdk8組合引起的。這裏討論了類似的問題:Log4j 2 hangs when creating logger和here:log4j LogManager.getLogger get's stuck in an infinite loop

但是沒有一個解決方案適用於我。這個問題對我來說也有點不同。 這裏我們去:

我的應用程序的主要方法是在初始化Logger對象之前做一些初始化的東西(比如清理舊的日誌文件等)。每個步驟都通過System.out.println打印出來用於調試目的。這裏是一個減少例如:

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

當我在Eclipse執行的代碼(調試或運行的配置並不重要)的immedeate輸出(< 1秒開始和結束)作爲預期:

執行對MyTestCase ...

初始化東西1 ...

初始化東西2 ...

初始化記錄器...

初始化完成!

啓動GUI ...

當我創建可運行JAR或包裹.EXE(帶L4J),並執行與安裝在目標平臺上的JDK或JRE 8應用程序的結果是這樣的:

執行對MyTestCase ...

初始化東西1 ...

初始化東西2 ...

初始化記錄器...爲根據設備<上〜10-45秒

應用程序掛起/攤位 - 這是實際的問題!

初始化完成!

啓動GUI ...

當我這樣做究竟對JDK 7中的「部署」可執行編譯同樣的事情發射一樣快,在Eclipse中。這真的很奇怪,我不知道該怎麼做。

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用於無論)此問題不會occure

  • 與JDK或JRE運行7作爲可運行罐子或EXE的問題不occure

  • 與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)initalising你的記錄器嗎? – GAlexMES

+0

@Ulathar你先升級到'2.8.1'如何?從我看到的這是最新的 – Eugene

+0

@GAlexMES: 現在使用「Logger org.apache.logging.log4j.LogManager.getLogger(String name)」。 – Ulathar

回答

0

這已經有一段時間,但問題是「解決」,因爲該項目已被遷移到JDK 9 我仍然不知道使用JDK 8導致這些問題的原因是什麼,但是它們已經使用JDK 9消失了。所以我認爲這是「已解決」。