jline / jline3

JLine is a Java library for handling console input.
Other
1.46k stars 214 forks source link

Unable to create a terminal #1053

Closed liu-xinhui closed 1 month ago

liu-xinhui commented 1 month ago

IntelliJ IDEA 2024.2 (Ultimate Edition) mac m1 pro macOS Ventura 13.6 java version "21.0.1" 2023-10-17 LTS Java(TM) SE Runtime Environment (build 21.0.1+12-LTS-29)

public class ConsoleArrowKeySelection {
    public static void main(String[] args) throws IOException {
        Logger.getLogger("org.jline").setLevel(Level.ALL);
        Terminal terminal = TerminalBuilder.terminal();
    }
}
8月 09, 2024 5:37:12 下午 org.jline.utils.Log logr
警告: input is tty: false
8月 09, 2024 5:37:12 下午 org.jline.utils.Log logr
警告: output is tty: false
8月 09, 2024 5:37:12 下午 org.jline.utils.Log logr
警告: error is tty: false
8月 09, 2024 5:37:12 下午 org.jline.utils.Log logr
警告: Creating a dumb terminal
java.lang.IllegalStateException: Unable to create a terminal
    at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:459)
    at org.jline.terminal.TerminalBuilder.build(TerminalBuilder.java:427)
    at org.jline.terminal.TerminalBuilder.terminal(TerminalBuilder.java:140)
    at com.step.tpl.codegen.ConsoleArrowKeySelection.main(ConsoleArrowKeySelection.java:14)
    Suppressed: java.lang.UnsupportedClassVersionError: org/jline/terminal/impl/ffm/FfmTerminalProvider has been compiled by a more recent version of the Java Runtime (class file version 66.0), this version of the Java Runtime only recognizes class file versions up to 65.0
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        at org.jline.terminal.spi.TerminalProvider.load(TerminalProvider.java:68)
        at org.jline.terminal.TerminalBuilder.checkProvider(TerminalBuilder.java:748)
        at org.jline.terminal.TerminalBuilder.getProviders(TerminalBuilder.java:713)
        at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:460)
        ... 3 more
    Suppressed: java.io.IOException: Unable to load terminal provider jansi: null
        at org.jline.terminal.spi.TerminalProvider.load(TerminalProvider.java:71)
        at org.jline.terminal.TerminalBuilder.checkProvider(TerminalBuilder.java:748)
        at org.jline.terminal.TerminalBuilder.getProviders(TerminalBuilder.java:717)
        at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:460)
        ... 3 more
    Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:74)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at org.jline.terminal.spi.TerminalProvider.load(TerminalProvider.java:69)
        ... 6 more
    Caused by: java.lang.NoClassDefFoundError: org/fusesource/jansi/internal/Kernel32
        at org.jline.terminal.impl.jansi.JansiTerminalProvider.verifyAtLeast(JansiTerminalProvider.java:85)
        at org.jline.terminal.impl.jansi.JansiTerminalProvider.<init>(JansiTerminalProvider.java:93)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        ... 9 more
    Caused by: java.lang.ClassNotFoundException: org.fusesource.jansi.internal.Kernel32
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        ... 12 more
    Suppressed: java.io.IOException: Unable to load terminal provider jna: null
        at org.jline.terminal.spi.TerminalProvider.load(TerminalProvider.java:71)
        at org.jline.terminal.TerminalBuilder.checkProvider(TerminalBuilder.java:748)
        at org.jline.terminal.TerminalBuilder.getProviders(TerminalBuilder.java:719)
        at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:460)
        ... 3 more
    Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:74)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at org.jline.terminal.spi.TerminalProvider.load(TerminalProvider.java:69)
        ... 6 more
    Caused by: java.lang.NoClassDefFoundError: com/sun/jna/Platform
        at org.jline.terminal.impl.jna.JnaNativePty.isatty(JnaNativePty.java:192)
        at org.jline.terminal.impl.jna.JnaNativePty.isPosixSystemStream(JnaNativePty.java:170)
        at org.jline.terminal.impl.jna.JnaTerminalProvider.checkSystemStream(JnaTerminalProvider.java:124)
        at org.jline.terminal.impl.jna.JnaTerminalProvider.<init>(JnaTerminalProvider.java:31)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        ... 9 more
    Caused by: java.lang.ClassNotFoundException: com.sun.jna.Platform
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        ... 14 more
gnodet commented 1 month ago

You need to configure a provider, see https://github.com/jline/jline3?tab=readme-ov-file#ffm-vs-jni-vs-jansi-vs-jna-vs-exec. This is usually done by adding the needed jar to the classpath (see https://github.com/jline/jline3?tab=readme-ov-file#artifacts). You also need the required dependencies. I suggest to use the JNI one.