我只是尝试用Jansi实现JLine,但是它总是抛出与UnsupportedOperationException
相同的org.jline.terminal.impl.jansi.JansiSupportImpl#winSysTerminal
。检查此方法,只有一个简单的if
可以决定此异常。
所以版本号一定是问题...要检查它们,我将检测版本的代码复制到了我的源代码中
public static void main(String[] args) throws Exception {
String v = Ansi.class.getPackage().getImplementationVersion();
System.out.println(Ansi.class.getPackage());
if (v != null) {
Matcher m = Pattern.compile("([0-9]+)\\.([0-9]+)([\\.-]\\S+)?").matcher(v);
if (m.matches()) {
System.out.println("Major: " + Integer.parseInt(m.group(1)));
System.out.println("Minor: " + Integer.parseInt(m.group(2)));
}
}
//System.setProperty("jansi.passthrough", "true");
AnsiConsole.systemInstall();
String prompt = Ansi.ansi()
.eraseScreen()
.fg(Ansi.Color.BLUE).bold().a("Console")
.fgBright(Ansi.Color.BLACK).bold().a(" > ")
.reset().toString();
Terminal terminal = TerminalBuilder.builder()
.system(true)
.dumb(false)
.encoding(Charset.forName("UTF-8"))
.name("Terminal")
.jna(false)
.jansi(true)
.build();
LineReader reader = LineReaderBuilder.builder()
.terminal(terminal)
.build();
String line;
while ((line = reader.readLine(prompt)) != null) {
System.out.println(line);
}
}
结果让我感到惊讶:
尽管它在IntelliJ中返回
package org.fusesource.jansi, jansi, version 1.17.1, Major: 1, Minor: 17
,但是由于intellijs虚拟控制台,该控制台无法工作,但是在构建后从命令行运行它时,它仅返回package org.fusesource.jansi
。这可能是由于intellij删除了包含该信息的清单所致。它们无法打包,因为它们的名称与运行jar文件所需的清单相同。你们知道任何解决方案或解决方法吗?您如何处理此异常?还是我失败了?
最佳答案
看来您是将Jansi嵌入自己的jar中。
如果您愿意,您应该可以破解jar的MANIFEST.MF
以包含Jansi的相关信息。
Manifest-Version: 1.0
Created-By: peter
...
Name: org/fusesource/jansi/
Implementation-Version: 1.17.1
关于java - 构建后的JLine3“无法创建系统终端”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50737843/