JShell的限制是什么?

Thu*_*fir 16 java scripting jvm system-administration jshell

我发现了这个问题,而另一个,这个有趣的是它引出了几个问题,至少对我而言:

相当开放的问题,但在哪里被jshell 限制?显然,GUI应用程序不在域中用于jshell解决方案或IDE替换:

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

维恩图或其他视觉效果的奖励积分.

当然,片段的大小应该是有限的.我更想问一下使用片段无法解决哪些问题.

也可以看看:

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

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

tuc*_*uxi 16

回答更新的问题

所有问题都可以通过片段解决(并且使用足够复杂的shell脚本).但JShell最适合用于调试和学习java - 一个成熟的程序对于所有其他用例更加灵活.

JShell,.jsh和 java MyClass.java

JShell是一个用于尝试java代码的交互式shell.从本质上讲,它是Java 的REPL.

由于JShell是关于你输入代码片段的所有内容,然后它会进行评估,并且将这些片段放在一个文件中而不是多次编写它们通常是有意义的,JShell支持.jsh脚本,其中包含要由JShell解释的片段集合.在这个意义上,这类似于bash接受.sh文件或command.com接受.bat文件 - 逐行键入它们等同于导入它们.

单源java文件执行是一个非常不同的野兽.从JDK 11开始取代糖,

java MyClass.java arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)

通过您当地的脚本编写相当于写作

TMPDIR=$(mktemp -d)
javac -d $TMPDIR MyClass.java
java -cp $TMPDIR MyClass arg1 arg2 arg3
rm -rf $TMPDIR
Run Code Online (Sandbox Code Playgroud)

这允许使用单个命令从命令行快速执行单源文件,而无需将所编译的类全部留在原位(不需要创建实际的临时目录,因为java可以将这些类存储在内存中).由于它们已经有了3种其他的执行模式java(对于类,jar文件和模块),因此将它添加为第四种并不是很好.

由于OP想要一张图片: 维恩图显示JShell,.jsh和JEP330是如何相交的

Java作为脚本语言

现在区别很明显(.jsh用于JShell,单源java可执行文件只适用于你猜对了,单源java可执行文件),那么使用Java作为脚本语言呢?

你总是可以选择写一个发射器; 例如,

 #!/bin/bash
 java -jar MyApp.jar
Run Code Online (Sandbox Code Playgroud)

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

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

#!/path/to/java --source 11
<source of MyClass.java>
Run Code Online (Sandbox Code Playgroud)

将其标记为可执行文件,并从命令行启动它,就像启动任何其他可执行文件一样.例如,将其复制并粘贴到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]));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

$ ./helloworld
Hello world!
Run Code Online (Sandbox Code Playgroud)

甚至它的论点也是正确的:

$ ./helloworld Bob!
Hello bob!
Run Code Online (Sandbox Code Playgroud)

对于小程序,并且如果您不需要在JDK之外引入其他库,现在可以非常容易地分发用于命令行使用的Java代码.

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

  • 它有一个非常好的REPL循环
  • 你可以更容易地执行短程序


Nam*_*man 6

嗯,当然,它仅限于在确定IDE和图形用户界面可以提供的范围方面带来正常的REPL实用程序.与单一源代码程序相比,我会谈到它的功能.保持与众不同的功能仍然来自单个源代码程序:

  • 有编辑的历史
  • 制表完成
  • 自动添加所需的终端分号和
  • 可配置的预定义导入和定义

正如单文件源代码程序JEP的替代方案中所提到的那样:

我们可以将"一次性运行"的任务委托给该jshell工具.虽然这可能起初看起来很明显,但这是设计中明确的非目标jshell.

jshell 工具旨在成为一个交互式外壳,并且做出了许多设计决策,有利于提供更好的交互式体验.

由于成为批处理运行程序的额外限制而使其负担将减损交互式体验.


!限制和行为!

另一方面,使用JShell执行动手而不是简单地阅读文档时,人们通常会发现的限制(假设功能)很少:

!功能和更多!!!

链接的更多细节使其优先于单个文件源代码程序:


归档时间:

查看次数:

598 次

最近记录:

7 年,8 月 前