JShell的局限性是什么?

时间:2018-12-20 10:41:47

标签: java scripting jvm system-administration jshell

我发现了this个问题,而这个other令人着迷,至少提出了几个问题,至少对我来说是这样:

这是一个开放式的问题,但是jshell被限制在哪里?显然,GUI应用程序不在jshell解决方案或IDE替代的域中:

  

图形界面和调试器支持超出范围。 JShell的   API旨在允许IDE和其他工具中的JShell功能,   但是jshell工具并非旨在用作IDE。

维恩图或其他视觉效果的奖励点。

当然,摘要的大小应受到限制。我只是在问片段无法解决哪些问题。

另请参阅:

https://openjdk.java.net/jeps/222

https://openjdk.java.net/jeps/330

2 个答案:

答案 0 :(得分:14)

回答更新的问题

所有问题都可以通过代码片段(以及足够复杂的shell脚本)解决。但是JShell最好用于调试和学习Java-完整的程序对于其他所有用例都更加灵活。

JShell,.jsh和java MyClass.java

JShell是用于试用Java代码的交互式shell。本质上,它是Java的REPL

由于JShell只需您键入代码片段,然后对其进行评估,并且将这些片段放入文件中而不是多次编写它们通常是有意义的,因此JShell支持.jsh脚本,其中包含集合JShell解释的代码片段集。从这个意义上讲,这类似于bash接受.sh文件或command.com接受.bat文件-逐行键入等同于导入它们。

Single-source java-file execution是非常不同的野兽。从JDK 11开始,用糖代替

java MyClass.java arg1 arg2 arg3

相当于书写的本地脚本

TMPDIR=$(mktemp -d)
javac -d $TMPDIR MyClass.java
java -cp $TMPDIR MyClass arg1 arg2 arg3
rm -rf $TMPDIR

这允许使用单个命令从命令行快速执行单源文件,而无需到处放置其编译类(无需创建实际的临时目录,因为java可以存储内存中的那些类)。由于他们在java中已经有3种其他执行模式(用于类,jar文件和模块),因此将其添加为第四种是很困难的。

由于OP想要一张照片: Venn diagram showing how JShell, .jsh and JEP330 intersect

Java作为脚本语言

现在区别很明显(.jsh用于JShell,您猜到它仅用于单源Java可执行文件,单源Java可执行文件),那么将Java用作脚本语言该怎么办?

您始终可以选择编写启动器;例如

 #!/bin/bash
 java -jar MyApp.jar

已经工作了很久了。从技术上讲,可以直接命名一个类,但并不太有用,因为jar文件在分发二进制文件时更方便-一方面,它们避免将包结构镜像为一堆文件夹。但是,将启动程序脚本与实际的Java代码分开还是不友好的:您现在需要将两者保持在一起,或者至少让启动程序能够找到要启动的实际.jar。

现在,他们还引入了以下快捷方式:无论文件名或扩展名如何,您都可以使用“ shebang前缀”分发Java源,如下所示:

#!/path/to/java --source 11
<source of MyClass.java>

将其标记为可执行文件,然后从命令行启动它,就像您可以启动任何其他可执行文件一样。例如,将其复制并粘贴到helloworld文件中(并在尝试运行它之前修复jdk位置):

#!/opt/jdk-11.0.1/bin/java --source 11 
public class Test {
    public static void main(String ... args) {
        System.out.println("Hello " + (args.length == 0 ? "world!" : args[0]));
    }
}

将其标记为可执行文件后,可以直接使用

启动它
$ ./helloworld
Hello world!

甚至正确接受其参数:

$ ./helloworld Bob!
Hello bob!

对于小型程序,并且如果您不需要离开JDK即可引入其他库,那么现在分发Java代码以供命令行使用将变得非常容易。

Java仍然不会成为一种“脚本语言”(它永远不会与python竞争),但是

  • 它有一个非常不错的REPL循环
  • 您可以更轻松地执行简短程序

答案 1 :(得分:6)

当然,就限制IDE和图形用户界面可以提供的功能而言,它仅限于带来普通的REPL实用程序。与单一源代码程序相比,我将更多地讨论其功能。使它与单一源代码程序区别开的功能:

  • 具有编辑记录的历史记录
  • tab-completion
  • 自动添加所需的终端分号和
  • 可配置的预定义导入和定义

Single-File Source-Code Programs JEP的替代方案中也提到:

  

我们可以将“一次性运行”任务委派给jshell工具。而   乍一看似乎很明显,这是明显的非目标   jshell的设计。

     

jshell 工具被设计为交互式的   外壳,并且许多设计决策都倾向于提供一个   更好的互动体验。

     

通过其他方式加重负担   成为批处理运行者的限制会损害   互动体验。


!!!局限性和行为!!!

另一方面,在使用JShell而不是简单阅读文档进行动手操作时,大多数人会发现的局限性(假定的功能)将是:

!!!功能和更多!!!

有关链接的更多详细信息,使它可以更好地控制“单个文件源代码程序”: