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

如何用Java轻松编写REPL应用程序?,java,read-eval-print-loop,Java,Read Eval Print Loop,我有一个提供客户端库的CMS服务器。我希望能够从命令行以交互方式驱动CMS 基本方法是: 创建到CMS的连接 将CMS连接对象添加到REPL上下文 将REPL连接到stdout/stderr/stdin 启动的守护进程线程以保持REPL运行 我希望我可以利用Groovy来实现这一点,但还没有成功地让它工作 是否有提供REPL支持的库? 你能提供一个简单的例子吗?提到。这行吗?如果您不介意使用Scala作为您的语言,您可以使用Scala REPL来探索java库。您可以通过多种方式实现这一点,或者

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

基本方法是:

  • 创建到CMS的连接
  • 将CMS连接对象添加到REPL上下文
  • 将REPL连接到stdout/stderr/stdin
  • 启动的守护进程线程以保持REPL运行
  • 我希望我可以利用Groovy来实现这一点,但还没有成功地让它工作

    是否有提供REPL支持的库?

    你能提供一个简单的例子吗?

    提到。这行吗?

    如果您不介意使用Scala作为您的语言,您可以使用Scala REPL来探索java库。您可以通过多种方式实现这一点,或者

    $scala-classpath yourjarfileshere.jar

    或者如果您正在使用maven:

    mvn scala:控制台

    如果您所做的只是玩(而不是编写脚本或任何事情),那么这是一种可行的方法

    如果您希望嵌入repl,并且仍然愿意使用Scala,可以查看以下问题的答案: 及


    Groovy还有一个repl,groovysh,您可以使用它进行探索。

    我在Groovy中得到了这个结果

    例子 已知问题 但是,当应用程序从Eclipse启动时(即使用Eclipse“控制台”视图),它将不起作用。要解决这个问题,您必须更新Eclipse启动配置以传递以下VM参数:
    -Djline.terminal=jline.UnsupportedTerminal

    更多信息

    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的控制台窗口中键入它,然后它会很好地与您进行对话

    谢谢。我想嵌入REPL并将其分发给一些人。我知道我可以为现有语言(Scala、Groovy等)启动一个REPL并添加JAR。我查看了GroovySh类,但没有成功地使其工作:-(将自己的对象添加到解释器很容易。如果要运行程序并键入
    print(foo),可以执行
    I.set(“foo”,“bar”)
    )
    它会将
    输出到控制台。这意味着您可以将您的服务添加到解释器中,然后通过系统与他们交谈。例如,如果您使用spring来配置和运行应用程序,您可以从应用程序上下文中取出一些bean并将其设置到解释器中。wra可以改进此答案中的示例代码对i.eval(str)进行映射在一个try/catch中,记录解释器抱怨的内容。代码中显示的外部try/catch也应该记录,但在关闭时可能只看到IO异常或线程中断异常。通过在输入repl之前执行java包的导入语句,可以改进此答案中的示例代码。在进入逻辑之前,必须以交互方式键入较长的导入语句,这是非常乏味的。在我2012年8月24日的回答中,有一个在beanshell中如何执行的示例。
    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) {
        }
    }