首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JShell的限制是什么?

JShell的限制是什么?
EN

Stack Overflow用户
提问于 2018-12-20 10:41:46
回答 2查看 1.8K关注 0票数 17

我发现了的问题,还有这个其他,非常有趣,它引出了几个问题,至少对我来说是这样:

这是一个开放的问题,但jshell仅限于哪里?显然,GUI应用程序不属于jshell解决方案或IDE替换的领域:

超出范围的是图形界面和调试器支持。JShell API的目的是允许IDE和其他工具中的JShell功能,但是jshell工具并不打算成为IDE。

文恩图或其他视觉效果的加分。

当然,片段的大小应该是有限的。我更想问的是,哪类问题不能用代码片段解决。

另见:

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-20 11:55:58

回答更新的问题

所有问题都可以用代码片段(也可以使用足够复杂的shell脚本)解决。但是JShell最好用于调试和学习java --一个成熟的程序对于所有其他用例来说都要灵活得多。

java MyClass.java JShell,.jsh和

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

由于JShell的全部内容都是输入代码片段,然后对代码段进行计算,所以将这些代码段放入文件中而不是多次编写代码段通常是有意义的,因此JShell支持.jsh脚本,其中包含将由JShell解释的代码段集合。从这个意义上说,这类似于bash接受.sh文件或command.com接受.bat文件--逐行键入它们相当于导入它们。

单源java文件执行是一只完全不同的野兽。是糖取代了,从JDK 11开始,

代码语言:javascript
复制
java MyClass.java arg1 arg2 arg3

由本地脚本编写,相当于编写

代码语言:javascript
复制
TMPDIR=$(mktemp -d)
javac -d $TMPDIR MyClass.java
java -cp $TMPDIR MyClass arg1 arg2 arg3
rm -rf $TMPDIR

这允许使用单个命令从命令行快速执行单个源文件,并且无需将编译好的类放在各处(不需要创建实际的临时目录,因为java可以将这些类存储在内存中)。由于java中已经有了其他3种执行模式(对于类、jar文件和模块),将其作为第四种执行模式并不是什么大问题。

因为OP想要一张照片:

作为脚本语言的

既然区别已经很清楚(.jsh用于JShell,单源java可执行文件只适用于单源java可执行文件),那么使用Java作为脚本语言怎么样呢?

您总是可以选择编写一个启动程序;例如,

代码语言:javascript
复制
 #!/bin/bash
 java -jar MyApp.jar

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

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

代码语言:javascript
复制
#!/path/to/java --source 11
<source of MyClass.java>

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

代码语言:javascript
复制
#!/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]));
    }
}

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

代码语言:javascript
复制
$ ./helloworld
Hello world!

它甚至认为自己的论点是正确的:

代码语言:javascript
复制
$ ./helloworld Bob!
Hello bob!

对于小型程序,如果您不需要在JDK之外使用额外的库,那么现在分发java代码以供命令行使用要容易得多。

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

  • 它有一个非常好的REPL循环
  • 您可以更容易地执行短程序。
票数 16
EN

Stack Overflow用户

发布于 2018-12-20 12:05:23

当然,它仅限于在定义IDE和图形用户界面所能提供的范围方面带来正常的REPL实用程序。与单个源代码程序相比,我将更多地讨论它的功能。使其与单个源代码程序仍然不同的特性:

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

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

我们可以将“一次性运行”的任务委托给jshell工具。虽然这在一开始看起来很明显,但在jshell的设计中,这是一个明显的非目标。 jshell工具被设计成一个交互式的shell,许多设计决策都支持提供更好的交互体验。 给它增加额外的约束,使其成为批处理运行者,将降低交互体验。

!!!限制和行为!

另一方面,在使用JShell (而不是简单地阅读文档)执行手动操作时,很少有限制(假设的功能)是:

!!!特征等等!

关于使它比单个文件源代码程序占上风的链接的更多细节:

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53867043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档