Ula*_*har 5 java eclipse logging java-8 log4j2
//更新1:
我做了一些测试,删除了大部分的lib并注释掉了lib特定的代码,导致了相同的行为,这让我得出结论,这个问题不是(直接)由这些lib引起的,但似乎是我的一般问题代码和/或设置.
这里的主要问题是我不明白为什么它在eclipse(即时启动,高性能等)中启动时运行完美,而同样的代码在我在eclipse之外启动它时会有所描述的问题(作为runnable JAR使用相同的JDK!).
有人可以了解可能存在的差异吗?
// END OF UPDATE 1
//原帖:
来自我在这里问到的一个较旧的问题:使用launch4j和jdk8包装.exe需要很长时间才能启动.使用jdk7开始几乎是即时的
现在我知道它与使用jdk8的launch4j无关,但它似乎是由我的应用程序中的jdk8组合的log4j引起的.这里讨论了类似的问题:创建logger时Log4j 2挂起,这里:log4j LogManager.getLogger陷入无限循环.
但是这些解决方案都不适合我.问题对我来说也有点不同.开始了:
我的应用程序的主要方法是在初始化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...");
}
}
Run Code Online (Sandbox Code Playgroud)
当我从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秒,具体取决于设备< - 这是实际问题!
初始完成!
启动GUI ...
当我针对JDK 7编译完全相同的事情时,"部署的"可执行文件的启动速度与Eclipse内部一样快.这真的很奇怪,我不知道如何对付它.
我的构建路径/库用于测试目的和实验:
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>
Run Code Online (Sandbox Code Playgroud)
自从项目迁移到 JDK 9 以来,已经有一段时间了,但问题已经“解决”了。我仍然不知道是什么导致了 JDK 8 的这些问题,但使用 JDK 9 这些问题已经消失了。所以我认为这个“已解决” ”。
| 归档时间: |
|
| 查看次数: |
433 次 |
| 最近记录: |