Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JLine3“;无法创建系统终端";建成后_Java_Intellij Idea_Jline_Jline3_Jansi - Fatal编程技术网

Java JLine3“;无法创建系统终端";建成后

Java JLine3“;无法创建系统终端";建成后,java,intellij-idea,jline,jline3,jansi,Java,Intellij Idea,Jline,Jline3,Jansi,我只是尝试用Jansi实现JLine,但它总是抛出相同的不支持操作异常引用org.JLine.terminal.impl.Jansi.JansiSupportImpl#winSysTerminal。检查此方法时,只有一个简单的if决定此异常 所以版本号一定是问题所在。。。为了检查它们,我将检测版本的代码复制到源代码中 public static void main(String[] args) throws Exception { String v = Ansi.class.getP

我只是尝试用Jansi实现JLine,但它总是抛出相同的
不支持操作异常
引用
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的
MANIFEST.MF
,以包含Jansi的相关信息

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

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

你这个小黑客-但它是有效的^^让我知道如果有一个解决方案而不陷入危险,我将在任何时候为自己在清单中需要这个属性