JLine3 «Невозможно создать системный терминал» после сборки - PullRequest
0 голосов
/ 07 июня 2018

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

Fernflower decompiled of given source

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

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 Ответ

0 голосов
/ 07 июня 2018

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

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

Name: org/fusesource/jansi/
Implementation-Version: 1.17.1
...