//更新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>
你試過用org.apache.log4j.Logger.getLogger(MyTestCase.class)initalising你的記錄器嗎? – GAlexMES
@Ulathar你先升級到'2.8.1'如何?從我看到的這是最新的 – Eugene
@GAlexMES: 現在使用「Logger org.apache.logging.log4j.LogManager.getLogger(String name)」。 – Ulathar