JLine3"无法创建系统终端"构建后

时间:2018-06-07 09:33:41

标签: java intellij-idea jline jline3 jansi

我只是尝试使用Jansi实现JLine,但它始终引用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);
    }

}

结果让我感到惊讶: 虽然它在IntelliJ中返回package org.fusesource.jansi, jansi, version 1.17.1, Major: 1, Minor: 17,但由于intellijs虚拟控制台控制台不起作用,所以当我在构建后从命令行运行它时,它仅返回package org.fusesource.jansi。这必须是由intellij删除包含信息的清单引起的。它们无法打包,因为它们与运行jar文件所需的清单名称相同。

你们知道任何解决方案或解决方法吗?你如何处理这个例外?或者有什么我失败了吗?

1 个答案:

答案 0 :(得分:2)

看来你把Jansi嵌入你自己的罐子里。 如果你,你应该能够破解你的MANIFEST.MF jar,以包含Jansi的相关信息。

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

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