【问题标题】:Java command line "shell" with auto-complete具有自动完成功能的 Java 命令行“shell”
【发布时间】:2012-09-17 16:44:45
【问题描述】:

我需要创建一个 Java 命令行,以便在服务器上远程调用该命令行。它需要:

  • 从用户那里读取“行”文本。
  • 识别用户是否按下“tab”键以促进自动完成。
  • 识别用户是否按“上/下”键查看历史记录。

在我开始自己动手之前,有没有人知道一个 Java 库可以促进全部或部分这方面的工作?

在 ssh 的命令行中,它可能看起来像这样:

bob> java -jar MyTool.jar

MyTool 已启动。
请输入命令:

> server1 启动
服务器正在启动...
服务器启动

> server2 加载帐户
完成

> server3 关闭
完成

>退出

【问题讨论】:

  • 为了帮助您进行谷歌搜索,您正在寻找的关键字是“readline”,它是支持 Bash 命令行等的 C 库。我在下面的回答中为您找到了几个类似 Java readline 的库。您可能会发现其他一些更适合您的需求。

标签: java autocomplete stdin


【解决方案1】:

更新:picocli-shell-jline2picocli-shell-jline3 结合了 JLine 2 和 3 与 picocli 的优势。

Picocli 允许您使用very little code 编写带有选项和位置参数的命令(和子命令),该库将为所有命令生成 JLine 2 和 3 命令完成程序。

它在使用帮助消息中使用 ANSI 颜色和样式,并具有许多其他独特的功能,如可否定选项、可重复嵌套参数组、变量插值等。

免责声明:我是作者,因此有偏见。

【讨论】:

    【解决方案2】:

    Apache Karaf 有一个命令外壳,可用作库来为其他应用程序构建命令外壳。您创建类来表示命令,并使用注释来指定命令的选项。 Karaf 库提供选项卡补全、历史记录和行编辑,以及交互运行或读取文件或命令行参数以作为脚本执行的能力。

    我发现了它here 并在我自己的项目中使用了它;它工作得很好。因为我没用过,所以没法和其他的比较。

    【讨论】:

      【解决方案3】:

      在这个派对上有点晚了,但我会添加 CrashCliche

      【讨论】:

        【解决方案4】:

        查看JReadlinejline2

        【讨论】:

        • Jreadline 非常有前途,jline2 似乎需要在 JNI 中进行一些处理
        • 似乎 Jreadline 不再存在,或者托管在其他地方。有什么想法吗?
        【解决方案5】:

        你看过BeanShell吗?它不像一个真正的 shell(如 bash 或 csh),但它可以让你像解释器一样输入 java 命令,你可以使用 tab 来自动完成。

        我只使用了 1.X 版本的 bean shell,但它们总是为你打开一个窗口,所以你不能在现有的 shell 中运行它。

        【讨论】:

        • 听起来很酷。听起来比支持读取用户输入文本行的 API 复杂得多,但仍然值得一看!
        【解决方案6】:

        您似乎想同时提出 3 个不同的问题,却不知道您真正想要的答案是什么。

        • 接受用户输入并提供自动完成是微不足道的,我非常怀疑你会找到一个通用库来完成这样的任务

        • 解析复杂的类似 bash 的语句听起来很酷,并且可能存在一个库来执行此操作,但我认为它不会给您很大的空间来创建自己的一组类似 bash 的指令。 (特别是考虑到您说它需要比您可以作为 bash 脚本执行的任何操作更复杂 - 这是一项艰巨的任务)

        • 将简单的用户输入解析为命令行输入或命令也相当简单,如果这是您要查找的内容,您应该查看此可能的重复项:How to parse command line arguments in Java?

        我建议重新调整您的问题,使其更具体地说明您正在寻找什么,并避免强调“自动完成”的琐碎任务并简单地接受用户在文本框中的输入。

        【讨论】:

          【解决方案7】:

          我假设您的意思类似于 python 解释器。 Java中没有等价物的原因是Java需要编译成字节码才能执行。

          如果您正在寻找具有良好自动完成功能的东西。我会推荐eclipse或netbeans。它们还会自动编译您的应用程序,让您在编写完成后快速运行代码。

          希望对您有所帮助。

          【讨论】:

          • 不是我要问的。为了清楚起见,编辑了问题。
          • 哦,我明白了。恐怕我还没有听说过这样的事情,抱歉。
          • 顺便说一句,Java 被编译这一事实并没有真正排除拥有类似 python 的 shell。 Scala 在 JVM 上编译和运行,它的 REPL (read-eval-print-loop) 运行良好。事实上,我有时会使用 Scala 的 REPL 来对 Java 进行交互式访问。
          • 编译后面的代码不应该改变早期代码的编译方式,因此编译和运行每一行输入应该是完全可以接受的(我假设这是 JIT,及时,编译器作品)。
          猜你喜欢
          • 2017-01-23
          • 2013-12-23
          • 2017-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-15
          • 2010-11-14
          • 1970-01-01
          相关资源
          最近更新 更多