Discussion:
Maven and TTY terminal
Petar Tahchiev
2018-11-24 09:00:13 UTC
Permalink
Hi guys,

my setup is Ubuntu Linux and Java8. I'm trying to use JLine from Maven to
get a TerminalBuild and determine the size of the command line. So JLine
has this code inside TerminalBuilder;

Pty pty = load(JansiSupport.class).current();

private <S> S load(Class<S> clazz) {
return ServiceLoader.load(clazz, clazz.getClassLoader()).iterator().next();
}

When I call JBuilder from one of my annotation processors during
compilation, then Pty is successfully created and so I get a
TerminalBuilder and it all works fine. However, when I call it from one of
my JUnit tests the code throws this exception when .current() is invoked:

java.io.IOException: Not a tty
at
org.jline.terminal.impl.jansi.linux.LinuxNativePty.current(LinuxNativePty.java:29)
at
org.jline.terminal.impl.jansi.JansiSupportImpl.current(JansiSupportImpl.java:54)
at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:340)

JLine can also use JNA, but when I added the JNA dependency the story is
the same - when running it from surefire plugin the exception is:

com.sun.jna.LastErrorException: [25] Inappropriate ioctl for device
at com.sun.jna.Native.invokeVoid(Native Method)
at com.sun.jna.Function.invoke(Function.java:414)
at com.sun.jna.Function.invoke(Function.java:360)

Do you know why this happens? Is there any setting that I can set on the
surefire plugin to avoid these types of error?
--
Regards, Petar!
Karlovo, Bulgaria.
---
Public PGP Key at:
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x19658550C3110611
Key Fingerprint: A369 A7EE 61BC 93A3 CDFF 55A5 1965 8550 C311 0611
Olaf Flebbe
2018-11-25 11:17:04 UTC
Permalink
Hi,

I do not know the implementation of maven surefire plugin. However, what you are trying to achieve is not safe. you cannot assume you have an PTY , for instance if the output is consumed by something like — a testing framework. AFAIK java does not provide an API for this.

If you absolutly need this, it is your duty to fire up a program like screen, tmux or expect to provide you with a terminal emulation and connect your testing instance with it. That might be very tricky , so I advise you to fail jline initialization gracefully and continue instead. This is what I did way in the past for similar problems.

Best,
Olaf Flebbe
Post by Petar Tahchiev
Hi guys,
my setup is Ubuntu Linux and Java8. I'm trying to use JLine from Maven to
get a TerminalBuild and determine the size of the command line. So JLine
has this code inside TerminalBuilder;
Pty pty = load(JansiSupport.class).current();
private <S> S load(Class<S> clazz) {
return ServiceLoader.load(clazz, clazz.getClassLoader()).iterator().next();
}
When I call JBuilder from one of my annotation processors during
compilation, then Pty is successfully created and so I get a
TerminalBuilder and it all works fine. However, when I call it from one of
java.io.IOException: Not a tty
at
org.jline.terminal.impl.jansi.linux.LinuxNativePty.current(LinuxNativePty.java:29)
at
org.jline.terminal.impl.jansi.JansiSupportImpl.current(JansiSupportImpl.java:54)
at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:340)
JLine can also use JNA, but when I added the JNA dependency the story is
com.sun.jna.LastErrorException: [25] Inappropriate ioctl for device
at com.sun.jna.Native.invokeVoid(Native Method)
at com.sun.jna.Function.invoke(Function.java:414)
at com.sun.jna.Function.invoke(Function.java:360)
Do you know why this happens? Is there any setting that I can set on the
surefire plugin to avoid these types of error?
--
Regards, Petar!
Karlovo, Bulgaria.
---
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x19658550C3110611
Key Fingerprint: A369 A7EE 61BC 93A3 CDFF 55A5 1965 8550 C311 0611
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-***@maven.apache.org
For additional commands, e-mail: dev-***@maven.apache.org

Loading...