在JDK 11中启动单文件源代码程序
JEP 330 –啟動單文件源代碼程序是即將發布的JDK 11(18.9)發行版中令人興奮的功能之一。 此功能允許直接使用java解釋器執行Java源代碼。 源代碼在內存中編譯,然后由解釋器執行。 限制是必須在同一文件中定義所有類。
對于剛開始學習Java并想嘗試簡單程序的人來說,此功能特別有用。 該功能與jshell將是任何初學者學習該語言的絕佳工具集。 不僅它們,而且專業人員也可以使用這些工具來探索新的語言更改或嘗試未知的API。
在本文中,我將不詳細介紹如何實現此功能,而是將通過嘗試不同的示例來專注于使用此功能。 讓我們從最簡單的示例開始,像往常一樣,Hello World!
最簡單的例子
下面的代碼保存在文件HelloWorld.java
public class HelloWorld{public static void main(String[] args){System.out.println("Hello World!!!");} }我將運行上面的代碼,如下所示:
PS G:\samples\java11\single-file> java HelloWorld.java Hello World!!!在上面的示例中,只有一個類,并且包含main方法。 使用java執行代碼時,我們需要將以.java擴展名結尾的文件的名稱傳遞給它。 如果文件名不以.java擴展名結尾,那么我們必須使用--source選項,如我們在下一個示例中看到的那樣。
帶有命令行參數
讓我們增強Hello Worl程序,為每個人創建個性化的問候:
public class Greeting{public static void main(String[] args){if ( args == null || args.length < 1 ){System.err.println("Name required");System.exit(1);}System.out.println(String.format("Hello %s!!", args[0]));} }讓我們將上面的代碼存儲在名為HelloGreeting.java的文件中。 請注意,文件名與公共類的名稱不匹配。 讓我們使用以下代碼運行上面的代碼:
PS G:\samples\java11\single-file> java HelloGreeting.Java sana Hello sana!!在要執行的文件名之后提供給代碼的任何參數。 讓我們將HelloGreeting.java重命名為greeting然后嘗試使用相同的方法執行:
PS G:\samples\java11\single-file> java greeting sana Error: Could not find or load main class greeting Caused by: java.lang.ClassNotFoundException: greeting您可以看到,在沒有.java的情況下,解釋器正在通過提供的名稱作為參數來搜索編譯的類。 在這種情況下,我們需要使用--source選項,如下所示:
PS G:\samples\java11\single-file> java --source 11 greeting sana Hello sana!!讓我向您展示當使用--source選項時,為JDK 10編寫的代碼如何不適用于JDK 9:
public class Java10Compatible{public static void main(String[] args){var message = "Hello world";System.out.println(message);} }讓我們對JDK 10和JDK 9執行以上操作,如下所示:
PS G:\samples\java11\single-file> java --source 10 Java10Compatible.java Hello world PS G:\samples\java11\single-file> java --source 9 Java10Compatible.java .\Java10Compatible.java:3: error: cannot find symbolvar message = "Hello world";^symbol: class varlocation: class Java10Compatible 1 error error: compilation failed單個文件中包含多個類
如前所述,此功能支持駐留在單個文件中的運行代碼,因此文件中的類數沒有限制。 讓我們看一個包含兩個類的示例代碼:
public class SimpleInterest{public static void main(String[] args){if ( args == null || args.length < 3 ){System.err.println("Three arguments required: principal, rate, period");System.exit(1);}int principal = Integer.parseInt(args[0]);int rate = Integer.parseInt(args[1]);int period = Integer.parseInt(args[2]);double interest = Maths.simpleInterest(principal, rate, period);System.out.print("Simple Interest is: " + interest);} }public class Maths{public static double simpleInterest(int principal, int rate, int period){return ( principal * rate * period * 1.0 ) / 100;} }讓我們運行這個:
PS G:\samples\java11\single-file> java .\SimpleInterest.java 1000 2 10 Simple Interest is: 200.0對于定義了多個類的文件,第一類應包含main方法,并且在內存中編譯后的解釋器將使用第一類來啟動執行。
使用模塊
使用選項--add-modules=ALL-DEFAULT在內存中編譯的代碼作為未命名模塊的一部分運行。 這使代碼可以使用不同的模塊,而無需使用module-info.java顯式聲明依賴關系。
讓我們看一下使用新的HTTP客戶端API進行HTTP調用的代碼。 這些在Java 9中作為孵化器功能引入的API已從孵化器移至java.net.http模塊。 示例代碼為:
import java.net.http.*; import java.net.http.HttpResponse.BodyHandlers; import java.net.*; import java.io.IOException;public class ExternalModuleDepSample{public static void main(String[] args) throws Exception{HttpClient client = HttpClient.newBuilder().build();HttpRequest request = HttpRequest.newBuilder().GET().uri(URI.create("https://reqres.in/api/users")).build();HttpResponse<String> response = client.send(request, BodyHandlers.ofString());System.out.println(response.statusCode());System.out.println(response.body()); } }我們可以通過發出以下命令來運行以上代碼:
PS G:\samples\java11\single-file>java ExternalModuleDepSample.java 200 {"page":1,"per_page":3,"total":12,"total_pages":4, "data":[{"id":1,"first_name":"George","last_name":"Bluth", "avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg"}, {"id":2,"first_name":"Janet","last_name":"Weaver", "avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"}, {"id":3,"first_name":"Emma","last_name":"Wong", "avatar":"https://s3.amazonaws.com/uifaces/faces/twitter/olegpogodaev/128.jpg"}]}這使我們能夠快速測試不同模塊中的新功能,而無需創建模塊, module-info文件等。
Shebang文件
在本節中,我們將研究創建shebang文件。 Shebang文件是通過使用語法#!/path/to/executable作為#!/path/to/executable的第一行提供執行程序,可以直接在Unix系統上執行的那些文件。
讓我們創建一個shebang文件:
#!/g/jdk-11/bin/java --source 11public class SimpleInterest{public static void main(String[] args){if ( args == null || args.length < 3 ){System.err.println("Three arguments required: principal, rate, period");System.exit(1);}int principal = Integer.parseInt(args[0]);int rate = Integer.parseInt(args[1]);int period = Integer.parseInt(args[2]);double interest = Maths.simpleInterest(principal, rate, period);System.out.print("Simple Interest is: " + interest);} }public class Maths{public static double simpleInterest(int principal, int rate, int period){if ( rate > 100 ){System.err.println("Rate of interest should be <= 100. But given values is " + rate);System.exit(1);}return ( principal * rate * period * 1.0 ) / 100;} }如果文件名不遵循標準的Java文件名命名約定,則使用shebang中的source選項。 在我們的例子中,我們將上面的代碼保存在一個名為simpleInterest的文件中,可以這樣運行:
sanaulla@Sana-Laptop /g/samples/java11/single-file (master) $ ./simpleInterest 1000 20 2 Simple Interest is: 400.0在Windows機器上,我使用了git安裝隨附的bash shell。 還有其他多種方式,例如Cygwin,Windows 10 Ubuntu支持等。
源代碼可以在這里找到。
翻譯自: https://www.javacodegeeks.com/2018/07/single-file-source-code-programs-jdk-11.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的在JDK 11中启动单文件源代码程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏《最终幻想 7:重生》正式开启预约,
- 下一篇: 索尼为 PS5 游戏机推出三种“Deep