首先,我正在学习scala和java世界的新手.我想创建一个控制台并将此控制台作为可以启动和停止的服务运行.我能够将ConsoleReader运行到Actor中,但我不知道如何正确地停止ConsoleReader.这是代码:
import eu.badmood.util.trace
import scala.actors.Actor._
import tools.jline.console.ConsoleReader
object Main {
def main(args:Array[String]){
//start the console
Console.start(message => {
//handle console inputs
message match {
case "exit" => Console.stop()
case _ => trace(message)
}
})
//try to stop the console after a time delay
Thread.sleep(2000)
Console.stop()
}
}
object Console {
private val consoleReader = new ConsoleReader()
private var running = false
def start(handler:(String)=>Unit){
running = true
actor{
while (running){
handler(consoleReader.readLine("\33[32m> \33[0m"))
}
}
}
def stop(){
//how to cancel an …
Run Code Online (Sandbox Code Playgroud) 我刚刚起床CDH 5.4
并安装了zookeeper.之前我曾多次成功使用过zkCli.这次命令行启动在到达提示符之前停止
Welcome to ZooKeeper!
JLine support is disabled
2015-05-04 18:18:33,936 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@975] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2015-05-04 18:18:33,952 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@852] - Socket connection established to localhost/127.0.0.1:2181, initiating session
2015-05-04 18:18:33,985 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x34d12349d0a15cf, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
Run Code Online (Sandbox Code Playgroud)
我知道通常的打印输出是启用了JLine支持
是什么让它陷入困境?我没有看到任何方法来改变这个Cloudera管理器配置页面.
我刚开始搞乱JLine来解析控制台模式下的字符输入.它似乎运作良好,但我想知道:
在JLine中是否存在非阻塞方式以查明字符是否可用?(就像kbhit()
在Windows中一样.)
我想我总是可以将键盘输入包装在自己的线程中,然后将线程安全队列中的键盘字符提供给主线程,但这似乎是不必要的.
编辑:这是逐字符解析.我不打算使用GUI.在控制台模式下,Java中通常的InputStream I/O要求您首先按Enter键(例如,它只是缓冲输入).请不要告诉我在Java中无法在控制台模式下输入逐个字符的输入; 事实并非如此.JLine使用具有平台相关实现的可移植接口来实现它.
编辑更新:我能够组合一个帮助程序类来在工作线程中执行阻塞I/O(对于每个字符的I/O使用JLine,警告:您必须自己解析Ctrl-C!)然后进行通信通过带有isempty()例程的同步队列.对于我现在正在做的事情,这很好,但我真的想知道未来的好方法.
我正在使用Jline2框架在Java中构建一个控制台应用程序.在Windows 7上从Eclipse启动应用程序时,shell立即存在,并且不会等待用户输入命令.
什么可能出错?
我正在使用JLine 2(v2.13)和Socket IO为我的应用程序创建一个管理控制台,可以通过普通的telnet客户端访问.但是我发现打印出换行符时会打印出奇怪的符号:
act.app.restart restart app^Jact.job.list List jobs
Run Code Online (Sandbox Code Playgroud)
正确的输出应该是:
act.app.restart restart app
act.job.list List jobs
Run Code Online (Sandbox Code Playgroud)
我追溯到代码,发现以下代码行导致了麻烦:
另一个奇怪的事情是当我按下向上箭头来获取历史记录时,控制台打印出来^[[A
并且没有其他任何事情发生.
有谁有想法吗?
更新:添加了相关的源代码
ConsoleReader
和分派命令的代码:更新2
对不起,我已经消失了一段时间.刚回来,因为我的项目让我呼吸新鲜空气.所以这就是发生的事情:我创建了一个PrintWriter
并将其用作^J
问题的解决方法:
但是,jline2
与telnet会话一起使用时还有许多其他问题:
<TAB>
显示选项卡而不是激活完整列表.但是,在我按下回车键后,它会给我一个完整的列表以及一条错误消息:
<UP>
箭头,显示^[[A
,按回车键,它将执行我的最后一个命令.但是我丢失了命令行编辑问题仍然存在,我相信应该有办法解决它只需要一些指导......
您使用哪个类似readline的Java库?像"readline"这样的库我指的是用于编辑控制台输入的库,支持历史记录,制表符完成以及类似的东西.我正在寻找一个,我无法从众多选择中选择(jLine - unmaintained,java-readline - 2003年最后一次发布,其他?)
出于某种原因,我无法使用jj的clojure REPL,我做的是git克隆github上的clojure存储库然后运行ant来构建它,然后我将jline-0.9.94.jar下载到clojure.jar的目录中,然后运行以下命令:
java -cp jline-0.9.94.jar:clojure.jar jline.ConsoleRunner clojure.main
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
Exception in thread "main" java.lang.ClassNotFoundException: clojure.main
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:317)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:375)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at jline.ConsoleRunner.main(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
以下是我当前目录中的文件:
vvshs-macbook-2:clojure vvsh$ ls
build.xml clojure-sources-1.2.0-master-SNAPSHOT.jar epl-v10.html src
classes clojure-sources.jar jline-0.9.94.jar test
clojure-1.2.0-master-SNAPSHOT.jar clojure.iml pom-template.xml
clojure-slim-1.2.0-master-SNAPSHOT.jar clojure.jar pom.xml
clojure-slim.jar doc readme.txt
vvshs-macbook-2:clojure vvsh$
Run Code Online (Sandbox Code Playgroud)
我在clojure 1.1和lein repl上得到了同样的错误(似乎lein维护了自己的clojure版本).
顺便说一句,这是在mac ox 10.5.8
java version "1.5.0_24"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_24-b02-357-9M3165)
Java HotSpot(TM) Client VM (build …
Run Code Online (Sandbox Code Playgroud) 无论是使用的JLine(或JLine2),是有可能发出一个电话readline
上ConsoleReader
,并有中,除了标准的提示,缓冲区预填充我选择的字符串?
我试过这样做,例如:
reader.getCursorBuffer().write("Default");
reader.readLine("Prompt> ");
Run Code Online (Sandbox Code Playgroud)
这似乎确实写入缓冲区,但该行只显示提示.如果我按回车键,就会按照我的预期readLine
返回"Default"
.如果我清除屏幕,则会重新绘制缓冲区并正确显示.
我的理解是,reader.redrawLine()
在打电话之后我应该以某种方式打电话readLine
.然而,最后一个是阻塞,这使得它很难(不是不可能,但使用第二个线程肯定是错误的).
当代码在想法中运行时,我没有使用jline的问题.使用bat文件运行时,编辑字符不会发送到终端.
java -classpath ..\JActor\target\classes;..\JID\target\classes;target\classes;..\slf4j-api-1.7.2.jar;..\slf4j-simple-1.7.2.jar;..\apache-sshd-0.8.0\lib\sshd-core-0.8.0.jar;..\apache-sshd-0.8.0\lib\mina-core-2.0.5.jar;..\apache-sshd-0.8.0\lib\bcprov-jdk15-140.jar;..\jline-2.9.jar;..\joda-time-2.1.jar org.agilewiki.jasocket.sshd.SSHServer %1%
Run Code Online (Sandbox Code Playgroud)
我检查了jline jar文件,它包含了jansi和hawtjni的fusesource代码.
我想知道如何实现ArgumentCompleter
这样一个如果我完成一个完整有效的命令,那么它将开始制作一个新命令的选项卡.
我原以为它可以构造成这样的东西:
final ConsoleReader consoleReader = new ConsoleReader()
final ArgumentCompleter cyclicalArgument = new ArgumentCompleter();
cyclicalArgument.getCompleters().addAll(Arrays.asList(
new StringsCompleter("foo"),
new StringsCompleter("bar"),
cyclicalArgument));
consoleReader.addCompleter(cyclicalArgument);
consoleReader.readLine();
Run Code Online (Sandbox Code Playgroud)
但是现在,在完成第一个选项卡后,这将停止工作 foo bar
是否有人熟悉图书馆,告诉我如何实施这个?或者有一种已知的方法可以做到这一点,我错过了吗?这也是使用JLine2.