我发现了this个问题,而这个other令人着迷,至少提出了几个问题,至少对我来说是这样:
这是一个开放式的问题,但是jshell
被限制在哪里?显然,GUI应用程序不在jshell
解决方案或IDE替代的域中:
图形界面和调试器支持超出范围。 JShell的 API旨在允许IDE和其他工具中的JShell功能, 但是jshell工具并非旨在用作IDE。
维恩图或其他视觉效果的奖励点。
当然,摘要的大小应受到限制。我只是在问片段无法解决哪些问题。
另请参阅:
答案 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文件和模块),因此将其添加为第四种是很困难的。
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竞争),但是
答案 1 :(得分:6)
当然,就限制IDE和图形用户界面可以提供的功能而言,它仅限于带来普通的REPL实用程序。与单一源代码程序相比,我将更多地讨论其功能。使它与单一源代码程序区别开的功能:
在Single-File Source-Code Programs JEP的替代方案中也提到:
我们可以将“一次性运行”任务委派给
jshell
工具。而 乍一看似乎很明显,这是明显的非目标jshell
的设计。
jshell
工具被设计为交互式的 外壳,并且许多设计决策都倾向于提供一个 更好的互动体验。通过其他方式加重负担 成为批处理运行者的限制会损害 互动体验。
另一方面,在使用JShell而不是简单阅读文档进行动手操作时,大多数人会发现的局限性(假定的功能)将是:
jshell与IDE Java 11 JShell inside Intellij IDEA
禁用历史记录Disable JShell history
已声明的变量应重置In jshell-11, why does a redeclared reference variable that resets to null still have a type?
使用jshell Create Module in JShell in Java 9
清除jshell控制台How to clear Java 9 JShell Console?
有关链接的更多详细信息,使它可以更好地控制“单个文件源代码程序”:
运行jshell文件How to run a JShell File?
如何在jshell Is there a way to use method references for top-level functions in jshell?