如何在Java中轻松编写REPL应用程序?

我有一个提供客户端库的CMS服务器。 我希望能够从命令行以交互方式驱动CMS。

基本方法是:

  1. 创建与CMS的连接
  2. 将CMS连接对象添加到REPL上下文
  3. 将REPL连接到stdout / stderr / stdin
  4. 启动守护程序线程以保持REPL运行。

我希望我可以利用Groovy来做到这一点,但还没有设法让它工作。

是否有提供REPL支持的库?
你能提供一个简单的例子吗?

如果您不介意使用Scala作为您的语言,可以使用Scala REPL来探索Java库。 您可以通过多种方式执行此操作

$ scala -classpath yourjarfileshere.jar

或者如果你正在使用maven:

mvn scala:console

如果您正在播放的所有内容(不是脚本或任何内容),那么这是一种可行的方法。

如果您希望嵌入您的repl,并且您仍然愿意使用Scala,您可以查看这些问题的答案: 在任意scala代码位置插入解释器并以编程方式启动Scala REPL?

Groovy还有一个repl,groovysh,你可以用来探索。

REPL的Wikipedia页面提到BeanShell 。 那会有用吗?

我用Groovy工作了。

public static void main(final String[] args) { Binding binding = new Binding(); // Configure your bindings here. Groovysh shell = new Groovysh(binding, new IO()); shell.run(args); } 

已知的问题

但是 ,当从Eclipse启动应用程序时(即使用Eclipse’控制台’视图),它将无法工作。 要解决此问题,必须更新Eclipse启动配置以传递以下VM参数:
-Djline.terminal=jline.UnsupportedTerminal

更多信息

  • Groovy Shell的文档 。

Beanshell可以在您的应用程序中的自己的线程/ main中作为repl运行:

 public static void main(String[] args) throws Exception{ Reader inreader = new InputStreamReader(System.in); Interpreter i = new Interpreter(inreader, System.out, System.err, true); try { BufferedReader in = new BufferedReader(inreader); String str; while ((str = in.readLine()) != null) { i.eval(str); } in.close(); } catch (Exception e) { } } 

那个例子在eclipse中运行很好,你在eclipse的控制台窗口输入它然后它会很好地回复你。