Я только что попытался реализовать JLine с Jansi, но он всегда выдает 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);
}
}
Результат меня удивил: хотя он возвращает package org.fusesource.jansi, jansi, version 1.17.1, Major: 1, Minor: 17
в IntelliJ, но консоль не работает из-за виртуальной консоли intellijs, он возвращает только package org.fusesource.jansi
, когда я запускаю ее из командной строки после сборки.Это должно быть вызвано удалением манифестов, содержащих информацию.Они не могут быть упакованы, потому что они имеют то же имя, что и манифест, который мне нужен для запуска файла jar.
Ребята, вы знаете какое-нибудь решение или обходной путь?Как вы справляетесь с этим исключением?Или я что-то потерпел неудачу?