diff --git a/pom.xml b/pom.xml
index 4db2500..7484b6e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.aohe
sane-service
- 1.0-SNAPSHOT
+ 0.0.2
21
@@ -57,8 +57,14 @@
true
1.18.30
+
+ org.java-websocket
+ Java-WebSocket
+ 1.5.3
+
+ sane-service-v${project.version}
org.apache.maven.plugins
diff --git a/src/main/java/org/aohe/Main.java b/src/main/java/org/aohe/Main.java
index c6e2386..16e9493 100644
--- a/src/main/java/org/aohe/Main.java
+++ b/src/main/java/org/aohe/Main.java
@@ -1,29 +1,36 @@
package org.aohe;
import java.io.IOException;
-import java.util.List;
+import java.net.UnknownHostException;
-import au.com.southsky.jfreesane.SaneDevice;
-import au.com.southsky.jfreesane.SaneException;
import lombok.extern.slf4j.Slf4j;
-import org.aohe.core.sane.utils.SaneSessionUtils;
+import org.aohe.core.utils.CommandUtils;
import org.aohe.core.utils.SystemUtils;
+import org.aohe.core.web.SocketServer;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
@Slf4j
public class Main {
- public static void main(String[] args) {
+ public static void main(String[] args) throws IOException, InterruptedException {
log.info(" 当前系统类型: {}", SystemUtils.getOsName());
- List deviceList;
- try {
- deviceList = SaneSessionUtils.getSaneDrivers();
- } catch (IOException | SaneException e) {
- log.info(" 获取驱动报错 {}", e.getMessage());
- throw new RuntimeException(e);
- }
- for (SaneDevice sane : deviceList){
- log.info(sane.getName());
- }
+ //初始化Sane Socket 守护进程
+ CommandUtils.initSanedSocket();
+ int port = 8997; // 843 flash policy port
+ SocketServer s = new SocketServer(port);
+ s.start();
+ System.out.println("scan-service started on port: " + s.getPort());
+ BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
+ while (true) {
+ String in = sysin.readLine();
+ s.broadcast(in);
+ if (in.equals("exit")) {
+ s.stop(1000);
+ break;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/src/main/java/org/aohe/core/sane/SaneOperational.java b/src/main/java/org/aohe/core/sane/SaneOperational.java
index cd87c1f..6028f7b 100644
--- a/src/main/java/org/aohe/core/sane/SaneOperational.java
+++ b/src/main/java/org/aohe/core/sane/SaneOperational.java
@@ -54,6 +54,8 @@ public class SaneOperational {
//r = startScan(param.getString("scannerId"),true);
}else if ("001016".equals(function)){
//r = startScan(param.getString("scannerId"),true);
+ SaneSessionUtils.printUsedIp();
+ r = R.ok();
}
}catch (Exception e){
log.info("Error , ", e);
diff --git a/src/main/java/org/aohe/core/sane/utils/SaneSessionUtils.java b/src/main/java/org/aohe/core/sane/utils/SaneSessionUtils.java
index 9830442..a096061 100644
--- a/src/main/java/org/aohe/core/sane/utils/SaneSessionUtils.java
+++ b/src/main/java/org/aohe/core/sane/utils/SaneSessionUtils.java
@@ -4,15 +4,25 @@ import au.com.southsky.jfreesane.SaneDevice;
import au.com.southsky.jfreesane.SaneException;
import au.com.southsky.jfreesane.SaneSession;
import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.net.Ipv4Util;
+import cn.hutool.core.net.NetUtil;
+import cn.hutool.core.util.ByteUtil;
+import cn.hutool.core.util.RuntimeUtil;
+import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
+import org.aohe.core.utils.CommandUtils;
+import org.aohe.core.utils.SystemUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.ExecutorService;
@Slf4j
public class SaneSessionUtils {
@@ -24,7 +34,9 @@ public class SaneSessionUtils {
private static volatile SaneDevice saneDevice;
private static final RemoteConfig remoteConfig = RemoteConfig.getInstance();
-
+
+ private static List beUsedIp = new ArrayList<>(64);
+
/**
* 获取一个SaneSession实例,用于与SANE设备进行通信
* @return SaneSession实例
@@ -168,6 +180,49 @@ public class SaneSessionUtils {
}
}
-
+
+ /**
+ * 测试可用ip
+ * @param ips ip
+ */
+ public static void beUsed(List ips){
+ try (ExecutorService executorService = SystemUtils.newFixedThreadPool(2);){
+ for(String ip : ips){
+ log.info("ip:{} , 开始检测", ip);
+ executorService.submit(() -> SaneSessionUtils.beUsed(ip));
+ }
+ }catch (Exception e){
+ log.info("查找出错 ");
+ }
+ }
+
+ /**
+ * 测试可用ip
+ * @param ip ip
+ */
+ public static void beUsed(String ip){
+ log.info("ip:{} , 可用性测试开始", ip);
+
+ if(!NetUtil.ping(ip)){
+ log.info("ip:{} , ping 测试不通过", ip);
+ return;
+ }
+ try (SaneSession session = SaneSession.withRemoteSane(InetAddress.getByName(ip))){
+ if(session == null){
+
+ return;
+ }
+ log.info("ip:{} , session 打开成功", ip);
+ //添加到可用列表
+ beUsedIp.add(ip);
+ } catch (IOException e) {
+ log.info("ip:{} , session 打开失败", ip);
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static void printUsedIp(){
+ log.info("可用ip {} ", String.join("|", beUsedIp));
+ }
}
diff --git a/src/main/java/org/aohe/core/utils/CommandUtils.java b/src/main/java/org/aohe/core/utils/CommandUtils.java
new file mode 100644
index 0000000..5f74ce7
--- /dev/null
+++ b/src/main/java/org/aohe/core/utils/CommandUtils.java
@@ -0,0 +1,53 @@
+package org.aohe.core.utils;
+
+import cn.hutool.core.util.RuntimeUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Slf4j
+public class CommandUtils {
+
+ public static void initSanedSocket(){
+ String cmdResult = execForStrUtf8("systemctl status saned.socket");
+ if (StrUtil.isNotEmpty(cmdResult)) {
+ String status = CommandUtils.getSanedSocketStatus(cmdResult);
+ log.info("saned.socket status:{}", status);
+ if (StrUtil.isNotEmpty(status) && "dead".equals(status)) {
+ execForStrUtf8("systemctl start saned.socket");
+ log.info("saned.socket successfully");
+ }
+ }
+ }
+
+ public static String execForStrUtf8(String command){
+ return RuntimeUtil.execForStr(StandardCharsets.UTF_8,command);
+ }
+
+ public static String getSanedSocketStatus(String commandResult) {
+ String result = "";
+ String[] resultArray = commandResult.split("\n");
+ List list = new ArrayList<>();
+ for (String item : resultArray) {
+ if (item.contains("Active:")) {
+ String serialItem = item.replace("*", "").replace("\t", "").replace(" ", "");
+ list.add(serialItem);
+ }
+ }
+ if (!list.isEmpty()) {
+ Pattern pattern = Pattern.compile("\\((.*?)\\)");
+ Matcher matcher = pattern.matcher(list.getFirst());
+ if (matcher.find()) {
+ result = matcher.group(1);
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/src/main/java/org/aohe/core/utils/SystemUtils.java b/src/main/java/org/aohe/core/utils/SystemUtils.java
index 1630389..3f00aa6 100644
--- a/src/main/java/org/aohe/core/utils/SystemUtils.java
+++ b/src/main/java/org/aohe/core/utils/SystemUtils.java
@@ -1,7 +1,23 @@
package org.aohe.core.utils;
+import cn.hutool.core.net.Ipv4Util;
+import cn.hutool.core.net.NetUtil;
+import org.aohe.core.sane.utils.SaneSessionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.*;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
public class SystemUtils {
-
+
+ private static final Logger log = LoggerFactory.getLogger(SystemUtils.class);
+
/**
* 判断操作系统是否是 Windows
*
@@ -45,4 +61,81 @@ public class SystemUtils {
public static String getOsName() {
return System.getProperty("os.name");
}
+
+ /**
+ *
+ * @return
+ */
+ public static String getIP(){
+ try {
+ InetAddress addr = Inet4Address.getLocalHost();
+ NetworkInterface network = NetworkInterface.getByInetAddress(addr);
+ log.info(addr.getHostAddress());
+ short mask = network.getInterfaceAddresses().get(0).getNetworkPrefixLength();
+ //Ipv4Util.list(addr, mask);
+ log.info(mask + "" );
+ } catch (UnknownHostException | SocketException e) {
+ throw new RuntimeException(e);
+ }
+ return "";
+ }
+
+ /**
+ * 获取第一个内网网卡地址
+ * @return 地址
+ */
+ public static String getInnerFirstEth(){
+ Enumeration netInterfaces;
+ try {
+ // 拿到所有网卡
+ netInterfaces = NetworkInterface.getNetworkInterfaces();
+ InetAddress ip;
+ // 遍历每个网卡,拿到 ip
+ while (netInterfaces.hasMoreElements()) {
+ NetworkInterface ni = netInterfaces.nextElement();
+ Enumeration addresses = ni.getInetAddresses();
+ while (addresses.hasMoreElements()) {
+ ip = addresses.nextElement();
+ if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(':') == -1) {
+ if(NetUtil.isInnerIP(ip.getHostAddress())){
+ //
+ if(ni.getName().startsWith("eth")){
+ NetworkInterface network = NetworkInterface.getByInetAddress(ip);
+ short mask = 24;
+ for(InterfaceAddress a : network.getInterfaceAddresses()){
+ if(ip.equals(a.getAddress())){
+ //遍历所有 取ip位相同的mask
+ mask = a.getNetworkPrefixLength();
+ }
+ }
+ System.out.println(mask);
+ return ip.getHostAddress()+"/"+mask;
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error("获取网卡信息失败");
+ }
+ return "127.0.0.1/24";
+ }
+
+ public static void main(String[] args) throws InterruptedException {
+ String ip = getInnerFirstEth();
+ List list = Ipv4Util.list(ip, false);
+ SaneSessionUtils.beUsed(list);
+
+ while (true){
+ Thread.sleep(10000);
+ SaneSessionUtils.printUsedIp();
+ }
+ }
+
+ public static ExecutorService newFixedThreadPool(int nThreads) {
+ return new ThreadPoolExecutor(nThreads, nThreads,
+ 0L, TimeUnit.MILLISECONDS,
+ new LinkedBlockingQueue<>());
+ }
+
}
\ No newline at end of file
diff --git a/src/main/java/org/aohe/core/web/SocketServer.java b/src/main/java/org/aohe/core/web/SocketServer.java
new file mode 100644
index 0000000..e87ecee
--- /dev/null
+++ b/src/main/java/org/aohe/core/web/SocketServer.java
@@ -0,0 +1,79 @@
+package org.aohe.core.web;
+
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import org.aohe.core.result.R;
+import org.aohe.core.sane.SaneOperational;
+
+import org.aohe.core.sane.utils.SaneSessionUtils;
+import org.aohe.core.utils.SystemUtils;
+import org.java_websocket.WebSocket;
+import org.java_websocket.handshake.ClientHandshake;
+import org.java_websocket.server.WebSocketServer;
+
+@Slf4j
+public class SocketServer extends WebSocketServer {
+
+
+ public SocketServer(int port) throws UnknownHostException {
+ super(new InetSocketAddress(port));
+ }
+
+ public SocketServer(int port, String path) throws UnknownHostException {
+ super(new InetSocketAddress(port));
+ }
+
+ public SocketServer(InetSocketAddress address) {
+ super(address);
+ }
+
+ @Override
+ public void onOpen(WebSocket conn, ClientHandshake handshake) {
+ conn.send("Welcome to the scan-server!"); // This method sends a message to the new client
+ log.info("client is open ,client system is: {}", SystemUtils.getOsName());
+ }
+
+ @Override
+ public void onClose(WebSocket conn, int code, String reason, boolean remote) {
+ log.info("client is closed , client system is : {}", SystemUtils.getOsName());
+ //这里执行关闭扫描仪连接
+ SaneSessionUtils.resource();
+ }
+
+ @Override
+ public void onMessage(WebSocket conn, String message) {
+ log.info("User send Data: \n{}", message);
+ String result;
+ if(!JSONUtil.isTypeJSON(message)){
+ result = R.fail("Illegal parameters, not of json type").toJsonStr();
+ }else {
+ result = SaneOperational.selectOperational(message);
+ }
+ log.info("Return data: \n {}", result);
+ conn.send(result);
+ }
+
+ @Override
+ public void onError(WebSocket conn, Exception ex) {
+ log.error("error :{}", ex.getMessage(), ex);
+ if (conn != null) {
+ //绑定不到就退出
+ //System.exit(0);
+ // some errors like port binding failed may not be assignable to a specific
+ // websocket
+ log.error( "System error ", ex );
+ }
+
+ }
+
+ @Override
+ public void onStart() {
+ log.info("Server started!");
+ setConnectionLostTimeout(0);
+ setConnectionLostTimeout(100);
+
+ }
+}
+
diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c730527
--- /dev/null
+++ b/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: org.aohe.Main
+
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..576cd2b
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/jni-config.json
@@ -0,0 +1,18 @@
+[
+{
+ "name":"java.lang.Boolean",
+ "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"java.lang.SecurityManager",
+ "fields":[{"name":"initialized"}]
+},
+{
+ "name":"org.aohe.Main",
+ "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }]
+},
+{
+ "name":"sun.management.VMManagementImpl",
+ "fields":[{"name":"compTimeMonitoringSupport"}, {"name":"currentThreadCpuTimeSupport"}, {"name":"objectMonitorUsageSupport"}, {"name":"otherThreadCpuTimeSupport"}, {"name":"remoteDiagnosticCommandsSupport"}, {"name":"synchronizerUsageSupport"}, {"name":"threadAllocatedMemorySupport"}, {"name":"threadContentionMonitoringSupport"}]
+}
+]
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..b8144ca
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/reflect-config.json
@@ -0,0 +1,227 @@
+[
+{
+ "name":"ch.qos.logback.classic.encoder.PatternLayoutEncoder",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "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.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.LoggerConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.MessageConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.MethodOfCallerConverter",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.pattern.ThreadConverter",
+ "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.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.pattern.PatternLayoutEncoderBase",
+ "methods":[{"name":"setPattern","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.rolling.RollingFileAppender",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"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.alibaba.fastjson.JSONArray"
+},
+{
+ "name":"com.alibaba.fastjson.JSONObject"
+},
+{
+ "name":"com.alibaba.fastjson2.JSONFactory$CacheItem",
+ "fields":[{"name":"bytes"}, {"name":"chars"}]
+},
+{
+ "name":"com.alibaba.fastjson2.JSONObject",
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"com.alibaba.fastjson2.util.TypeUtils$Cache",
+ "fields":[{"name":"chars"}]
+},
+{
+ "name":"com.alibaba.fastjson2.writer.FieldWriter",
+ "fields":[{"name":"initObjectWriter"}]
+},
+{
+ "name":"com.alibaba.fastjson2.writer.OWG_1_1_RemoteConfig",
+ "methods":[{"name":"","parameterTypes":["java.lang.Class","java.lang.String","java.lang.String","long","java.util.List"] }]
+},
+{
+ "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"java.beans.Transient"
+},
+{
+ "name":"java.io.FilePermission"
+},
+{
+ "name":"java.lang.RuntimePermission"
+},
+{
+ "name":"java.lang.String",
+ "fields":[{"name":"COMPACT_STRINGS"}, {"name":"coder"}, {"name":"value"}],
+ "methods":[{"name":"","parameterTypes":["byte[]","byte"] }, {"name":"coder","parameterTypes":[] }, {"name":"isASCII","parameterTypes":["byte[]"] }, {"name":"value","parameterTypes":[] }]
+},
+{
+ "name":"java.lang.StringCoding",
+ "methods":[{"name":"hasNegatives","parameterTypes":["byte[]","int","int"] }]
+},
+{
+ "name":"java.lang.invoke.MethodHandles$Lookup",
+ "fields":[{"name":"IMPL_LOOKUP"}],
+ "methods":[{"name":"","parameterTypes":["java.lang.Class","java.lang.Class","int"] }]
+},
+{
+ "name":"java.lang.management.ManagementFactory",
+ "methods":[{"name":"getRuntimeMXBean","parameterTypes":[] }]
+},
+{
+ "name":"java.lang.management.RuntimeMXBean",
+ "methods":[{"name":"getInputArguments","parameterTypes":[] }]
+},
+{
+ "name":"java.math.BigDecimal",
+ "fields":[{"name":"intCompact"}]
+},
+{
+ "name":"java.net.NetPermission"
+},
+{
+ "name":"java.net.SocketPermission"
+},
+{
+ "name":"java.net.URLPermission",
+ "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+ "name":"java.security.AllPermission"
+},
+{
+ "name":"java.security.SecurityPermission"
+},
+{
+ "name":"java.sql.Clob"
+},
+{
+ "name":"java.sql.Date"
+},
+{
+ "name":"java.sql.Timestamp"
+},
+{
+ "name":"java.util.Collections$UnmodifiableCollection"
+},
+{
+ "name":"java.util.Collections$UnmodifiableMap"
+},
+{
+ "name":"java.util.PropertyPermission"
+},
+{
+ "name":"java.util.concurrent.atomic.AtomicBoolean",
+ "fields":[{"name":"value"}]
+},
+{
+ "name":"java.util.concurrent.atomic.AtomicReference",
+ "fields":[{"name":"value"}]
+},
+{
+ "name":"javax.smartcardio.CardPermission"
+},
+{
+ "name":"javax.sql.DataSource"
+},
+{
+ "name":"javax.sql.RowSet"
+},
+{
+ "name":"org.aohe.core.sane.utils.RemoteConfig",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true
+},
+{
+ "name":"sun.misc.Unsafe",
+ "fields":[{"name":"theUnsafe"}]
+}
+]
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..e65a678
--- /dev/null
+++ b/src/main/resources/META-INF/native-image/resource-config.json
@@ -0,0 +1,31 @@
+{
+ "resources":{
+ "includes":[{
+ "pattern":"\\QMETA-INF/services/ch.qos.logback.classic.spi.Configurator\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/cn.hutool.core.convert.Converter\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/cn.hutool.log.LogFactory\\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":"\\Qconfig.setting\\E"
+ }, {
+ "pattern":"\\Qfastjson2.properties\\E"
+ }, {
+ "pattern":"\\Qlogback-test.scmo\\E"
+ }, {
+ "pattern":"\\Qlogback-test.xml\\E"
+ }, {
+ "pattern":"\\Qlogback.scmo\\E"
+ }, {
+ "pattern":"\\Qlogback.xml\\E"
+ }]},
+ "bundles":[]
+}
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
index 518b540..28d430a 100644
--- a/src/main/resources/logback.xml
+++ b/src/main/resources/logback.xml
@@ -1,7 +1,7 @@
-
+