JLine3 "Невозможно создать системный терминал" после сборки

Я просто пытался реализовать JLine с Jansi, но он всегда выбрасывает UnsupportedOperationException ссылаясь на org.jline.terminal.impl.jansi.JansiSupportImpl#winSysTerminal, Проверка этого метода есть только один простой if который решает это исключение.

Fernflower декомпилируется из данного источника

Так что номера версий должны быть проблемой... чтобы проверить их, я скопировал код, который определяет версии, в мой источник

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.

Ребята, вы знаете какое-нибудь решение или обходной путь? Как вы справляетесь с этим исключением? Или я что-то потерпел неудачу?

1 ответ

Решение

Кажется, ты встраиваешь Янси в свою банку. Если вы, вы должны быть в состоянии взломать MANIFEST.MF из вас банку, чтобы включить соответствующую информацию для Янси.

Manifest-Version: 1.0
Created-By: peter
...

Name: org/fusesource/jansi/
Implementation-Version: 1.17.1
Другие вопросы по тегам