diff --git a/.gitignore b/.gitignore
index cfb679a..75c87dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,4 @@ out/
target/
*.iml
/.gradle/
-
+/logs
diff --git a/README.md b/README.md
index b187cf8..d1a5841 100644
--- a/README.md
+++ b/README.md
@@ -129,5 +129,8 @@ mvn -Pwin gluonfx:build -D"https.proxyHost"=127.0.0.1 -D"https.proxyPort"=7890
mvn -Pmac gluonfx:build -D"https.proxyHost"=127.0.0.1 -D"https.proxyPort"=7890
```
+## 日志
+添加了支持GraalVM的Logback作为日志框架,在你自己的项目,如果是第一次添加以及后续修改了Logback配置文件的时候,在执行GraalVM构建之前,先用`mvn -Pwin gluonfx:runagent`或`.\gradlew.bat nativeRunAgent`来为`native-image`生成一些必要的文件,它会自动保存到`src/main/resources/META-INF/native-image`,然后在执行GraalVM构建,否则生成的程序执行时不会生成日志文件,正常情况下,会在程序执行目录创建`logs`目录及日志文件
+
## 补充
有时候`mvn gluonfx:build`或者`.\gradlew.bat jpackageImage`发生了错误后,执行`.\gradlew.bat clean`提示文件被占用,这时候可以打开`任务管理器-性能-资源监视器-CPU`,在`关联的句柄`处输入`gluon`、`jpackage`等关键词来检索出卡住的相关进程并干掉他
diff --git a/build.gradle b/build.gradle
index dec23b4..0e74efb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -35,6 +35,8 @@ javafx {
dependencies {
implementation("io.github.palexdev:materialfx:11.16.1")
+ implementation("org.slf4j:slf4j-api:2.0.12")
+ implementation("ch.qos.logback:logback-classic:1.5.3")
}
jlink {
diff --git a/pom.xml b/pom.xml
index 678f77b..68742dc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,16 @@
materialfx
11.16.1
+
+ org.slf4j
+ slf4j-api
+ 2.0.12
+
+
+ ch.qos.logback
+ logback-classic
+ 1.5.3
+
diff --git a/src/main/java/com/icuxika/MainApp.java b/src/main/java/com/icuxika/MainApp.java
index 7d75e66..cee7cf0 100644
--- a/src/main/java/com/icuxika/MainApp.java
+++ b/src/main/java/com/icuxika/MainApp.java
@@ -13,11 +13,15 @@
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.Locale;
public class MainApp extends Application {
+ private static final Logger LOGGER = LoggerFactory.getLogger(MainApp.class);
+
@Override
public void start(Stage primaryStage) throws Exception {
AppResource.setLanguage(Locale.SIMPLIFIED_CHINESE);
@@ -47,6 +51,12 @@ public void start(Stage primaryStage) throws Exception {
primaryStage.titleProperty().bind(AppResource.getLanguageBinding("title"));
primaryStage.setScene(new Scene(vBox, 600, 400));
primaryStage.show();
+
+ LOGGER.trace("[trace]日志控制台输出");
+ LOGGER.debug("[debug]日志控制台输出");
+ LOGGER.info("[info]日志记录到logs/application.log中");
+ LOGGER.warn("[warn]日志记录到logs/application.log中");
+ LOGGER.error("[error]日志记录到logs/application.log中");
}
public static void main(String[] args) {
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 39d7fed..5f761f0 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -8,6 +8,7 @@
requires javafx.web;
requires MaterialFX;
+ requires org.slf4j;
exports com.icuxika;
}
\ No newline at end of file
diff --git a/src/main/resources/META-INF/native-image/filter-file.json b/src/main/resources/META-INF/native-image/filter-file.json
new file mode 100644
index 0000000..d173ee0
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/filter-file.json
@@ -0,0 +1,11 @@
+{ "rules": [
+ {"excludeClasses" : "com.sun.glass.ui.mac.*"},
+ {"excludeClasses" : "com.sun.glass.ui.gtk.*"},
+ {"excludeClasses" : "com.sun.glass.ui.win.*"},
+ {"excludeClasses" : "com.sun.prism.es2.*"},
+ {"excludeClasses" : "com.sun.prism.d3d.*"},
+ {"excludeClasses" : "com.sun.scenario.effect.impl.es2.*"},
+ {"excludeClasses" : "com.sun.scenario.effect.impl.hw.d3d.*"},
+ {"excludeClasses" : "com.gluonhq.attach.**"}
+ ]
+}
diff --git a/src/main/resources/META-INF/native-image/jni-config.json b/src/main/resources/META-INF/native-image/jni-config.json
new file mode 100644
index 0000000..515741f
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/jni-config.json
@@ -0,0 +1,61 @@
+[
+{
+ "name":"[Lcom.sun.glass.ui.Screen;"
+},
+{
+ "name":"com.sun.glass.ui.Cursor",
+ "methods":[{"name":"getNativeCursor","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.glass.ui.Screen",
+ "methods":[{"name":"","parameterTypes":["long","int","int","int","int","int","int","int","int","int","int","int","int","int","int","int","float","float","float","float"] }]
+},
+{
+ "name":"com.sun.glass.ui.Size",
+ "methods":[{"name":"","parameterTypes":["int","int"] }]
+},
+{
+ "name":"com.sun.javafx.font.directwrite.DWRITE_GLYPH_METRICS",
+ "fields":[{"name":"advanceHeight"}, {"name":"advanceWidth"}, {"name":"bottomSideBearing"}, {"name":"leftSideBearing"}, {"name":"rightSideBearing"}, {"name":"topSideBearing"}, {"name":"verticalOriginY"}],
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.javafx.font.directwrite.DWRITE_GLYPH_RUN",
+ "fields":[{"name":"advanceOffset"}, {"name":"ascenderOffset"}, {"name":"bidiLevel"}, {"name":"fontEmSize"}, {"name":"fontFace"}, {"name":"glyphAdvances"}, {"name":"glyphIndices"}, {"name":"isSideways"}],
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.javafx.font.directwrite.DWRITE_MATRIX",
+ "fields":[{"name":"dx"}, {"name":"dy"}, {"name":"m11"}, {"name":"m12"}, {"name":"m21"}, {"name":"m22"}],
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.javafx.font.directwrite.RECT",
+ "fields":[{"name":"bottom"}, {"name":"left"}, {"name":"right"}, {"name":"top"}],
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.prism.impl.PrismSettings",
+ "fields":[{"name":"disableD3D9Ex"}, {"name":"forceGPU"}, {"name":"isVsyncEnabled"}, {"name":"verbose"}]
+},
+{
+ "name":"java.lang.Class",
+ "methods":[{"name":"forName","parameterTypes":["java.lang.String","boolean","java.lang.ClassLoader"] }]
+},
+{
+ "name":"java.lang.Runnable",
+ "methods":[{"name":"run","parameterTypes":[] }]
+},
+{
+ "name":"java.lang.String",
+ "methods":[{"name":"toLowerCase","parameterTypes":["java.util.Locale"] }]
+},
+{
+ "name":"java.util.ArrayList",
+ "methods":[{"name":"","parameterTypes":["int"] }, {"name":"add","parameterTypes":["java.lang.Object"] }]
+},
+{
+ "name":"java.util.HashMap",
+ "methods":[{"name":"containsKey","parameterTypes":["java.lang.Object"] }, {"name":"put","parameterTypes":["java.lang.Object","java.lang.Object"] }]
+}
+]
diff --git a/src/main/resources/META-INF/native-image/predefined-classes-config.json b/src/main/resources/META-INF/native-image/predefined-classes-config.json
new file mode 100644
index 0000000..0e79b2c
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/predefined-classes-config.json
@@ -0,0 +1,8 @@
+[
+ {
+ "type":"agent-extracted",
+ "classes":[
+ ]
+ }
+]
+
diff --git a/src/main/resources/META-INF/native-image/proxy-config.json b/src/main/resources/META-INF/native-image/proxy-config.json
new file mode 100644
index 0000000..0d4f101
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/proxy-config.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/src/main/resources/META-INF/native-image/reflect-config.json b/src/main/resources/META-INF/native-image/reflect-config.json
new file mode 100644
index 0000000..7d8e8dd
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/reflect-config.json
@@ -0,0 +1,312 @@
+[
+{
+ "name":"ch.qos.logback.classic.encoder.PatternLayoutEncoder",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.filter.ThresholdFilter",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setLevel","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.classic.joran.SerializedModelConfigurator",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.DateConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.FileOfCallerConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.LevelConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.LineOfCallerConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.LineSeparatorConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.MessageConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.ThreadConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.color.HighlightingCompositeConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.util.DefaultJoranConfigurator",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.core.ConsoleAppender",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.core.FileAppender",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.OutputStreamAppender",
+ "methods":[{"name":"setEncoder","parameterTypes":["ch.qos.logback.core.encoder.Encoder"] }]
+},
+{
+ "name":"ch.qos.logback.core.UnsynchronizedAppenderBase",
+ "methods":[{"name":"addFilter","parameterTypes":["ch.qos.logback.core.filter.Filter"] }]
+},
+{
+ "name":"ch.qos.logback.core.encoder.Encoder",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.encoder.LayoutWrappingEncoder",
+ "methods":[{"name":"setParent","parameterTypes":["ch.qos.logback.core.spi.ContextAware"] }]
+},
+{
+ "name":"ch.qos.logback.core.filter.Filter",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.pattern.PatternLayoutEncoderBase",
+ "methods":[{"name":"setPattern","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.pattern.color.BoldGreenCompositeConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.core.pattern.color.BoldYellowCompositeConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.core.pattern.color.CyanCompositeConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.core.rolling.RollingFileAppender",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setFile","parameterTypes":["java.lang.String"] }, {"name":"setRollingPolicy","parameterTypes":["ch.qos.logback.core.rolling.RollingPolicy"] }]
+},
+{
+ "name":"ch.qos.logback.core.rolling.RollingPolicy",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.rolling.RollingPolicyBase",
+ "methods":[{"name":"setFileNamePattern","parameterTypes":["java.lang.String"] }, {"name":"setParent","parameterTypes":["ch.qos.logback.core.FileAppender"] }]
+},
+{
+ "name":"ch.qos.logback.core.rolling.TimeBasedRollingPolicy",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setMaxHistory","parameterTypes":["int"] }, {"name":"setTotalSizeCap","parameterTypes":["ch.qos.logback.core.util.FileSize"] }]
+},
+{
+ "name":"ch.qos.logback.core.rolling.helper.DateTokenConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.core.spi.ContextAware",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.util.FileSize",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"com.icuxika.MainApp",
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"main","parameterTypes":["java.lang.String[]"] }]
+},
+{
+ "name":"com.sun.glass.ui.Screen"
+},
+{
+ "name":"com.sun.javafx.font.directwrite.DWFactory",
+ "methods":[{"name":"getFactory","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.javafx.logging.PrintLogger",
+ "methods":[{"name":"createInstance","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.javafx.logging.jfr.JFRPulseLogger",
+ "methods":[{"name":"createInstance","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.javafx.scene.control.skin.Utils",
+ "methods":[{"name":"getResource","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"com.sun.javafx.tk.quantum.QuantumToolkit",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.prism.GraphicsPipeline",
+ "methods":[{"name":"getFontFactory","parameterTypes":[] }, {"name":"getPipeline","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.prism.shader.FillCircle_Color_Loader",
+ "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
+},
+{
+ "name":"com.sun.prism.shader.FillPgram_Color_Loader",
+ "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
+},
+{
+ "name":"com.sun.prism.shader.Solid_Color_Loader",
+ "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
+},
+{
+ "name":"com.sun.prism.shader.Solid_TextureFirstPassLCD_Loader",
+ "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
+},
+{
+ "name":"com.sun.prism.shader.Solid_TextureRGB_Loader",
+ "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
+},
+{
+ "name":"com.sun.prism.shader.Solid_TextureSecondPassLCD_Loader",
+ "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
+},
+{
+ "name":"com.sun.prism.shader.Texture_Color_Loader",
+ "methods":[{"name":"loadShader","parameterTypes":["com.sun.prism.ps.ShaderFactory","java.io.InputStream"] }]
+},
+{
+ "name":"java.io.FilePermission"
+},
+{
+ "name":"java.lang.Character",
+ "methods":[{"name":"isIdeographic","parameterTypes":["int"] }]
+},
+{
+ "name":"java.lang.Class",
+ "methods":[{"name":"forName","parameterTypes":["java.lang.Module","java.lang.String"] }, {"name":"getModule","parameterTypes":[] }]
+},
+{
+ "name":"java.lang.Module",
+ "methods":[{"name":"getDescriptor","parameterTypes":[] }, {"name":"getLayer","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }]
+},
+{
+ "name":"java.lang.ModuleLayer",
+ "methods":[{"name":"boot","parameterTypes":[] }, {"name":"findModule","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"java.lang.RuntimePermission"
+},
+{
+ "name":"java.net.NetPermission"
+},
+{
+ "name":"java.net.SocketPermission"
+},
+{
+ "name":"java.net.URLPermission",
+ "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+ "name":"java.nio.ByteBuffer",
+ "methods":[{"name":"order","parameterTypes":["java.nio.ByteOrder"] }]
+},
+{
+ "name":"java.nio.ByteOrder",
+ "methods":[{"name":"nativeOrder","parameterTypes":[] }]
+},
+{
+ "name":"java.security.AllPermission"
+},
+{
+ "name":"java.security.SecurityPermission"
+},
+{
+ "name":"java.util.PropertyPermission"
+},
+{
+ "name":"java.util.concurrent.atomic.AtomicBoolean",
+ "fields":[{"name":"value"}]
+},
+{
+ "name":"java.util.concurrent.atomic.AtomicReference",
+ "fields":[{"name":"value"}]
+},
+{
+ "name":"javafx.animation.KeyValue"
+},
+{
+ "name":"javafx.scene.Camera"
+},
+{
+ "name":"javafx.scene.Node"
+},
+{
+ "name":"javafx.scene.ParallelCamera"
+},
+{
+ "name":"javafx.scene.Parent"
+},
+{
+ "name":"javafx.scene.Scene"
+},
+{
+ "name":"javafx.scene.control.Control"
+},
+{
+ "name":"javafx.scene.image.Image"
+},
+{
+ "name":"javafx.scene.layout.Pane"
+},
+{
+ "name":"javafx.scene.layout.Region"
+},
+{
+ "name":"javafx.scene.shape.Circle"
+},
+{
+ "name":"javafx.scene.shape.Rectangle"
+},
+{
+ "name":"javafx.scene.shape.Shape"
+},
+{
+ "name":"javafx.scene.text.Font"
+},
+{
+ "name":"javafx.scene.text.Text"
+},
+{
+ "name":"javafx.scene.transform.Transform"
+},
+{
+ "name":"javafx.stage.Stage"
+},
+{
+ "name":"javafx.stage.Window"
+},
+{
+ "name":"javax.smartcardio.CardPermission"
+},
+{
+ "name":"sun.misc.Unsafe",
+ "fields":[{"name":"theUnsafe"}]
+},
+{
+ "name":"sun.security.provider.MD5",
+ "methods":[{"name":"","parameterTypes":[] }]
+}
+]
diff --git a/src/main/resources/META-INF/native-image/resource-config.json b/src/main/resources/META-INF/native-image/resource-config.json
new file mode 100644
index 0000000..3f41e29
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/resource-config.json
@@ -0,0 +1,152 @@
+{
+ "resources":{
+ "includes":[{
+ "pattern":"\\QMETA-INF/services/ch.qos.logback.classic.spi.Configurator\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/java.lang.System$LoggerFinder\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/java.time.zone.ZoneRulesProvider\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/javax.xml.parsers.SAXParserFactory\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E"
+ }, {
+ "pattern":"\\Qlogback-test.scmo\\E"
+ }, {
+ "pattern":"\\Qlogback-test.xml\\E"
+ }, {
+ "pattern":"\\Qlogback.scmo\\E"
+ }, {
+ "pattern":"\\Qlogback.xml\\E"
+ }, {
+ "pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt72b/ubidi.icu\\E"
+ }, {
+ "pattern":"javafx.controls:\\Qcom/sun/javafx/scene/control/skin/modena/modena.bss\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-console-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-console-l1-2-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-datetime-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-debug-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-errorhandling-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-file-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-file-l1-2-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-file-l2-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-handle-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-heap-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-interlocked-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-libraryloader-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-localization-l1-2-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-memory-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-namedpipe-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-processenvironment-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-processthreads-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-processthreads-l1-1-1.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-profile-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-rtlsupport-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-string-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-synch-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-synch-l1-2-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-sysinfo-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-timezone-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-core-util-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-conio-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-convert-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-environment-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-filesystem-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-heap-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-locale-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-math-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-multibyte-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-private-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-process-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-runtime-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-stdio-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-string-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-time-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qapi-ms-win-crt-utility-l1-1-0.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qcom/sun/glass/utils/NativeLibLoader.class\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qcom/sun/prism/d3d/hlsl/FillCircle_Color.obj\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qcom/sun/prism/d3d/hlsl/FillPgram_Color.obj\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qcom/sun/prism/d3d/hlsl/Solid_Color.obj\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qcom/sun/prism/d3d/hlsl/Solid_TextureFirstPassLCD.obj\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qcom/sun/prism/d3d/hlsl/Solid_TextureRGB.obj\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qcom/sun/prism/d3d/hlsl/Solid_TextureSecondPassLCD.obj\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qcom/sun/prism/d3d/hlsl/Texture_Color.obj\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qglass.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qjavafx_font.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qmsvcp140.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qmsvcp140_1.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qmsvcp140_2.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qprism_d3d.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qucrtbase.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qvcruntime140.dll\\E"
+ }, {
+ "pattern":"javafx.graphics:\\Qvcruntime140_1.dll\\E"
+ }]},
+ "bundles":[{
+ "name":"LanguageResource",
+ "locales":["", "en", "zh-CN"]
+ }, {
+ "name":"com.sun.javafx.tk.quantum.QuantumMessagesBundle",
+ "locales":["", "zh-CN"]
+ }, {
+ "name":"com/sun/glass/ui/win/themes",
+ "locales":["", "zh-CN"]
+ }]
+}
diff --git a/src/main/resources/META-INF/native-image/serialization-config.json b/src/main/resources/META-INF/native-image/serialization-config.json
new file mode 100644
index 0000000..f3d7e06
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/serialization-config.json
@@ -0,0 +1,8 @@
+{
+ "types":[
+ ],
+ "lambdaCapturingTypes":[
+ ],
+ "proxies":[
+ ]
+}
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
new file mode 100644
index 0000000..9a0ac7e
--- /dev/null
+++ b/src/main/resources/logback.xml
@@ -0,0 +1,29 @@
+
+
+
+
+ %highlight(%-5level) %boldGreen(%d{yyyy-MM-dd HH:mm:ss.SSS}) %boldYellow([%thread]) %cyan([%F:%L]) - %highlight(%msg%n)
+
+
+
+
+
+ logs/application.log
+
+ INFO
+
+
+ logs/rolling/application.%d{yyyy-MM-dd}.log
+ 30
+ 3GB
+
+
+ %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%F:%L] %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file