// 更新 1:
我做了更多测试,删除了大部分库并注释掉了库特定代码,导致了相同的行为,这让我得出结论,这个问题不是(直接)由这些库引起的,但似乎是我的一个普遍问题代码和/或设置。
这里的主要问题是我不明白为什么它在从 Eclipse 内部启动时运行完美(即时启动、高性能等),而一旦我在 Eclipse 外部启动它(作为可运行 JAR 使用相同的 JDK!)。
有人可以阐明可能存在哪些差异吗?
// 更新 1 结束
// 原帖:
来自我在这里提出的一个较旧的问题:用 launch4j 和 jdk8 包装的 .exe 需要很长时间才能启动。使用jdk7代替几乎立即启动 https://stackoverflow.com/questions/37185972/wrapped-exe-with-launch4j-and-jdk8-takes-very-long-to-start-using-jdk7-instead
现在我知道它与 launch4j 和 jdk8 无关,但它似乎是由 log4j 与我的应用程序中的 jdk8 组合引起的。这里讨论了类似的问题:Log4j 2 创建记录器时挂起 https://stackoverflow.com/questions/35970675/log4j-2-hangs-when-creating-logger和这里:log4j LogManager.getLogger 陷入无限循环 https://stackoverflow.com/questions/17838807/log4j-logmanager-getlogger-gets-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 中执行代码时(调试或运行配置无关紧要),立即输出(开始和完成不到 1 秒)如预期:
执行 MyTestCase...
初始化东西 1...
初始化东西 2...
正在初始化记录器...
初始化完成!
正在启动图形用户界面...
当我创建可运行的 JAR 或包装的 .exe(使用 l4j)并使用目标平台上安装的 JDK 或 JRE 8 执行应用程序时,结果如下:
执行 MyTestCase...
初始化东西 1...
初始化东西 2...
正在初始化记录器...
应用程序挂起/停止大约 10-45 秒,具体取决于设备
初始化完成!
正在启动图形用户界面...
当我执行针对 JDK 7 编译的完全相同的操作时,“部署的”可执行文件的启动速度与在 Eclipse 中一样快。这真的很奇怪,我不知道该怎么办。
我的构建路径/用于测试目的和实验的库:
CJ奇才-0.22
公共编解码器-1.10
公共-io-2.4
公共语言3-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-core-2.8.1
sl4j-api-1.7.22
slf4j-nop-1.7.22
swingx-all-1.6.5-1
表格布局
vlcj-3.10.1
zip4j_1.3.2
知道是什么原因造成的吗?
Recap:
-
从 eclipse 内运行不会出现此问题(无论使用 jdk 7 还是 8)
-
使用 JDK 或 JRE 7 作为可运行的 jar 或 exe 运行,不会出现问题
-
使用 JDK 或 JRE 8 作为可运行的 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>