[英]What are the limits to JShell?
我發現了這個問題,而另一個 ,這個有趣的是它引出了幾個問題,至少對我而言:
相當開放的問題,但jshell
局限在哪里? 顯然,GUI應用程序不在jshell
解決方案或IDE替換的域中:
超出范圍的是圖形界面和調試器支持。 JShell API旨在允許IDE和其他工具中的JShell功能,但jshell工具並非旨在成為IDE。
維恩圖或其他視覺效果的獎勵積分。
當然,片段的大小應該是有限的。 我更想問一下使用片段無法解決哪些問題。
也可以看看:
回答更新的問題
所有問題都可以通過片段解決(並且使用足夠復雜的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
通過您當地的腳本編寫相當於寫作
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競爭),但是
嗯,當然,它僅限於在確定IDE和圖形用戶界面可以提供的范圍方面帶來正常的REPL實用程序。 與單一源代碼程序相比,我會談到它的功能。 保持與眾不同的功能仍然來自單個源代碼程序:
正如單文件源代碼程序JEP的替代方案中所提到的那樣:
我們可以將“一次性運行”的任務委托給
jshell
工具 。 雖然這可能起初看起來很明顯,但這是jshell
設計中明確的非目標。
jshell
工具被設計成一個交互式shell ,並且做出了許多設計決策,有利於提供更好的交互式體驗。由於成為批處理運行程序的額外限制而使其負擔將減損交互式體驗。
另一方面,使用JShell執行動手而不是簡單地閱讀文檔時,人們通常會發現的限制(假設功能)很少:
使用final變量最終變量在jshell中運行不正常
jshell與IDE的集成Java 11 JShell在Intellij IDEA中
禁用歷史記錄禁用JShell歷史記錄
應該重置重新聲明的變量在jshell-11中,為什么重置為null的重新聲明的引用變量仍然具有類型?
對象范圍訪問JShell中的“父范圍”
clear jshell console 如何清除Java 9 JShell控制台?
鏈接的更多細節使其優先於單個文件源代碼程序:
為什么以及如何使用JShell為什么以及如何使用?
導入項目的類路徑在JShell中,如何從Maven項目導入類路徑
通過JShell運行應用程序如何使用jshell 運行java應用程序?
list active methods 列出jshell中的所有活動方法
運行jshell文件如何運行JShell文件?
如何在jshell中使用方法引用有沒有辦法在jshell中為頂級函數使用方法引用?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.