通过IntelliJ运行JavaFX应用程序时,一切都很好。加载了自定义Log4j2附加程序,并且正确解析了所有FXML。但是,当使用Maven将应用程序打包为JAR时,找不到附加程序。为了解决这个问题,日志配置XML中包含一个packages="MyApp.util"
属性,它指向自定义附加程序的程序包。添加此属性后,应用程序会以XMLStreamException: ParseError
开始引用FXML文件中的任意行而崩溃。
此外,无论是否包含软件包属性,运行Jar时(在Intellij中为null null
),log4j2的版本都显示为Apache Log4j Core 2.12.1
:
2019-11-05 10:24:38,666 JavaFX Application Thread DEBUG null null initializing configuration XmlConfiguration[location=/home/me/config/logging.xml]
我已经确保Log4j API +核心实现都与Jar文件打包在一起。 Jar中包含一个基于Log4j 1.x的内部公司库,但是我不确定这是否会引起冲突。
Log4j2 XML配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" packages="MyApp.util">
<Appenders>
<Console name="Console" target="SYSTEM_ERR">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
</Console>
<FXAppender name="JavaFXLogger">
<PatternLayout pattern="%d{HH:mm:ss} %msg%n"/>
<ThresholdFilter level="warn"/>
</FXAppender>
</Appenders>
<Loggers>
<Logger name="MyApp.data.Acquisitioner" level="info"/>
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="JavaFXLogger"/>
</Root>
</Loggers>
</Configuration>
堆栈跟踪:
10:24:38.931 DEBUG BoosterADTM.util.ConfigurationManager - Loaded configuration from /home/me/config/config.xml
javafx.fxml.LoadException:
file:/home/me/MyApp.jar!/MyApp/views/TuneMeter.fxml:262
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2543)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at company.fx.ViewLoader.<init>(ViewLoader.java:34)
at company.fx.ViewLoader.<init>(ViewLoader.java:23)
at MyApp.controller.MainTabsController.initViews(MainTabsController.java:79)
at MyApp.controller.MainTabsController.initialize(MainTabsController.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2566)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at company.fx.ViewLoader.<init>(ViewLoader.java:34)
at company.fx.ViewLoader.<init>(ViewLoader.java:23)
at MyApp.Main.start(Main.java:27)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$419(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$399(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$397(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$398(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null$203(GtkApplication.java:139)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[262,49]
Message: Stream closed
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:599)
at javax.xml.stream.util.StreamReaderDelegate.next(StreamReaderDelegate.java:88)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2513)
... 30 more