//更新1:
我做了一些测试,删除了大部分的lib并注释掉了lib特定的代码,导致了相同的行为,这让我得出结论,这个问题不是(直接)由那些libs引起的,但似乎是一般的在我的代码和/或设置中出现问题。
这里的主要问题是我不明白为什么它在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的launch4j无关,但它似乎是由我的应用程序中jdk8组合的log4j引起的。这里讨论了类似的问题:Log4j 2 hangs when creating logger和此处: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 ...
Init Stuff 1 ...
Init Stuff 2 ...
初始化记录器......
初始化完成!
启动GUI ...
当我创建一个可运行的JAR或一个包装的.exe(带有l4j)并在目标平台上安装JDK或JRE 8来执行应用程序时,结果如下:
执行MyTestCase ...
Init Stuff 1 ...
Init Stuff 2 ...
初始化记录器......
应用程序挂起/停顿约10-45秒,具体取决于设备&lt; - 这是实际问题!
初始化完成!
启动GUI ...
当我针对JDK 7编译完全相同的事情时,“已部署”的可执行文件的启动速度与Eclipse内部一样快。这真的很奇怪,我不知道该怎么办。
我的构建路径/库用于测试目的&amp;实验:
CJWizards-0.22
公地编解码器 - 1.10
公地-IO-2.4
公地lang3-3.4
共享记录-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核-2.8.1
sl4j-API-1.7.22
SLF4J-NOP-1.7.22
swingx-ALL-1.6.5-1
tablelayout
vlcj-3.10.1
zip4j_1.3.2
知道造成这种情况的原因是什么?
回顾:
从日食中运行此问题不会发生(无论是否使用jdk 7或8)
使用JDK或JRE 7作为runnable jar或exe运行问题不会发生
以JDK或JRE 8作为runnable jar或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 :(得分:1)
已经有一段时间了,但问题已“解决”,因为该项目已迁移到JDK 9。 我仍然不知道是什么原因导致了JDK 8的这些问题,但它们已经使用JDK 9消失了。所以我认为这个“已经解决”了。