diff --git a/pom.xml b/pom.xml
index 78811ef..596ef64 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,6 +66,12 @@
sqlite-jdbc
${sqlite.jdbc.version}
+
+
+ org.jline
+ jline
+ 3.28.0
+
diff --git a/src/main/java/com/serliunx/ddns/ManagerLite.java b/src/main/java/com/serliunx/ddns/ManagerLite.java
index 694dc6a..1fb5d40 100644
--- a/src/main/java/com/serliunx/ddns/ManagerLite.java
+++ b/src/main/java/com/serliunx/ddns/ManagerLite.java
@@ -7,6 +7,12 @@ import com.serliunx.ddns.constant.SystemConstants;
import com.serliunx.ddns.core.context.FileInstanceContext;
import com.serliunx.ddns.core.context.MultipleSourceInstanceContext;
import com.serliunx.ddns.support.SystemInitializer;
+import com.serliunx.ddns.support.log.JLineAdaptAppender;
+import org.jline.reader.LineReader;
+import org.jline.reader.LineReaderBuilder;
+import org.jline.reader.impl.history.DefaultHistory;
+import org.jline.terminal.Terminal;
+import org.jline.terminal.TerminalBuilder;
/**
* 启动类
@@ -30,7 +36,7 @@ public final class ManagerLite {
*/
private static SystemInitializer systemInitializer;
- public static void main(String[] args) {
+ public static void main(String[] args) throws Exception {
// 配置初始化
initConfiguration(args);
@@ -40,6 +46,33 @@ public final class ManagerLite {
// 系统初始化
initSystem();
+
+ Terminal terminal = TerminalBuilder.builder().system(true).build();
+ LineReader lineReader = LineReaderBuilder.builder()
+ .terminal(terminal)
+ // 如果想记录历史命令,可以配置一个 History
+ .history(new DefaultHistory())
+ .build();
+
+ JLineAdaptAppender.setLineReader(lineReader);
+
+ String prompt = "client> ";
+
+ while (true) {
+ // 该方法会阻塞,直到用户敲回车
+ String line = lineReader.readLine(prompt);
+
+ // 当用户输入 exit 或 quit,就退出循环
+ if ("exit".equalsIgnoreCase(line)
+ || "quit".equalsIgnoreCase(line)) {
+ break;
+ }
+ // 在这里可以对用户输入做进一步处理
+ terminal.writer().println("You entered: " + line);
+ terminal.flush();
+ }
+
+ terminal.close();
}
/**
diff --git a/src/main/java/com/serliunx/ddns/support/log/JLineAdaptAppender.java b/src/main/java/com/serliunx/ddns/support/log/JLineAdaptAppender.java
new file mode 100644
index 0000000..9fa9b39
--- /dev/null
+++ b/src/main/java/com/serliunx/ddns/support/log/JLineAdaptAppender.java
@@ -0,0 +1,65 @@
+package com.serliunx.ddns.support.log;
+
+import ch.qos.logback.classic.PatternLayout;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.AppenderBase;
+import ch.qos.logback.core.Layout;
+import org.jline.reader.LineReader;
+
+/**
+ * 适配JLine的控制台日志输出
+ *
+ * @author SerLiunx
+ * @since 2025/1/15
+ */
+public final class JLineAdaptAppender extends AppenderBase {
+
+ /**
+ * JLine的输入读取
+ */
+ private static LineReader lineReader;
+
+ /**
+ * 格式控制
+ */
+ private Layout layout;
+
+ /**
+ * 所配置的格式
+ */
+ private String pattern;
+
+ @Override
+ public void start() {
+ super.start();
+ PatternLayout patternLayout = new PatternLayout();
+ patternLayout.setPattern(pattern);
+ patternLayout.setContext(getContext());
+ patternLayout.start();
+ this.layout = patternLayout;
+ }
+
+ @Override
+ protected void append(ILoggingEvent event) {
+ if (lineReader != null) {
+ String formattedLog = layout.doLayout(event);
+ lineReader.printAbove(formattedLog);
+ } else {
+ System.out.print(layout.doLayout(event));
+ }
+ }
+
+ /**
+ * 设置输入读取
+ *
+ * @param lr 读取
+ */
+ public static void setLineReader(LineReader lr) {
+ lineReader = lr;
+ }
+
+ @SuppressWarnings("all")
+ public void setPattern(String pattern) {
+ this.pattern = pattern;
+ }
+}
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
index 184ebf6..18dd6d6 100644
--- a/src/main/resources/logback.xml
+++ b/src/main/resources/logback.xml
@@ -3,18 +3,15 @@
-
-
-
- %boldGreen(%d{yyyy-MM-dd HH:mm:ss(SSS)}) %cyan([%pid]) %magenta([%15.15thread]) %green([%16.16instance]) %highlight([%-6level]) %boldCyan(%-36logger{32}): %msg%n
-
-
+
+
+ %boldGreen(%d{yyyy-MM-dd HH:mm:ss(SSS)}) %cyan([%pid]) %magenta([%15.15thread]) %green([%16.16instance]) %highlight([%-6level]) %boldCyan(%-36logger{32}): %msg%n
+
-
-
+
\ No newline at end of file