Summary
Provide a mechanism for enabling alternative java.io.Console
implementations within the JDK.
Problem
java.io.Console
instance is only available when the JVM is attached to an OS provided interactive console. Otherwise System.console()
returns null
. This is not very useful for applications such as jshell
in which the debugee process is not attached to a console.
Solution
Provide a means to utilize alternative Console
implementations within the JDK. Those alternative implementations of Console
may be returned with System.console()
even when the JVM is not attached to the underlying platform's TTY. This also allows replacing the default Console implementation with functionality-rich jline
.
The alternative Console
implementation is searched using ServiceLoader
with non-public jdk.internal.io.JdkConsoleProvider
interface. A new non-public system property jdk.console
designates the module name which the System.console()
returns the implementation. jdk.internal.le
and jdk.jshell
are only allowed to provide the implementation for security purposes. The Console implementation based on jline
is the default Console if the jdk.internal.le
module is available. The following chart depicts which instance is returned from System.console()
call:
w/ jdk.internal.le |
w/o jdk.internal.le |
|
---|---|---|
w/ TTY | jline Console |
built-in Console |
w/o TTY | jline Console |
(null) |
Specifying thejdk.console
system property overrides the above default, ie.,
-Djdk.console=jdk.jshell
will look for the implementation in jdk.jshell
module. If there is one, the above default Console will be replaced with the one in jdk.jshell
module.
Specification
Remove final
from the class definition of java.io.Console
class in order for creating a proxying subclass of it.
- csr of
-
JDK-8295803 Console should be usable in jshell and other environments
-
- Resolved
-