使用一个命令执行单个Java源文件
JDK增強(qiáng)提案 ( JEP ) 草案于2017年末創(chuàng)建,名為“ 啟動(dòng)單文件源代碼程序 ”(其相關(guān)的JDK問(wèn)題為JDK-8192920 )。 顧名思義,該JEP草案旨在“增強(qiáng)Java啟動(dòng)器以支持運(yùn)行作為Java源代碼的單個(gè)文件提供的程序。” 換句話說(shuō),正如JEP所描述的,如果有一個(gè)典型的自包含的HelloWorld.java源代碼文件 ,則只需從命令行運(yùn)行java HelloWorld.java ,而無(wú)需使用javac將HelloWorld.java編譯為HelloWorld.class在使用Java啟動(dòng)器運(yùn)行之前。
JEP所有者喬納森·吉本斯 ( Jonathan Gibbons)在將JEP引入compile -dev郵件列表時(shí)總結(jié)了這一點(diǎn):
該JEP草案包含一項(xiàng)增強(qiáng)| java |的建議。 啟動(dòng)器以支持運(yùn)行作為Java源代碼的單個(gè)文件提供的程序。 該程序?qū)⒈痪幾g并運(yùn)行,而無(wú)需顯式調(diào)用javac或打包jar文件。
預(yù)期該功能的主要用例是運(yùn)行非常簡(jiǎn)單的Java應(yīng)用程序( JEP稱其為“小型實(shí)用程序”)的人員以及希望學(xué)習(xí)基本Java功能的人們。 我在博客文章“ 通過(guò)簡(jiǎn)單測(cè)試學(xué)習(xí)Java ”和“在沒(méi)有IDE的情況下編譯和運(yùn)行Java ”中描述了類似的用例。 JEP指出,在這些用例的背景下,“純粹的儀式是在運(yùn)行程序之前必須先編譯程序。 此外,單個(gè)源文件可能會(huì)編譯為多個(gè)類文件,這給“運(yùn)行該程序”的簡(jiǎn)單目標(biāo)增加了打包開(kāi)銷。 希望能夠使用Java啟動(dòng)器直接從源代碼運(yùn)行程序。”
與該JEP草案相關(guān)的JDK郵件列表上有兩個(gè)有趣的討論要點(diǎn)。 討論的主題之一是在Java源代碼文件的第一行上放置“ shebang ”的能力,該文件應(yīng)按此JEP描述的方式運(yùn)行(例如,在Groovy中使用,在Linux / Unix shell)。 在撰寫本文時(shí),JEP草案目前在“ Shebang”文件的標(biāo)題下解決了該主題,并指出:
使用源文件模式調(diào)用Java啟動(dòng)程序的“ shebang”文件通常以以下內(nèi)容開(kāi)頭:
#!/path/to/java --source
如果文件以開(kāi)頭,則允許在源文件模式下使用此類文件
#! 在編譯文件的其余部分之前,將刪除第一行的內(nèi)容,但不包括第一換行符。 …當(dāng)文件以 #! ,則保留第一行末尾的換行符,以便任何錯(cuò)誤消息中的行號(hào)保持不變。
與該JEP草案相關(guān)的第二個(gè)有趣的討論點(diǎn)是問(wèn)題,即它是否與JDK 9引入的jshell的關(guān)系有關(guān)。 正如Brian Goetz在 compiler-dev郵件列表上的消息中所指出的那樣 ,“自然而然地”是期望使用jshell而不是增強(qiáng)的java啟動(dòng)器來(lái)運(yùn)行這些類似于shell的單一源Java源文件。 。 Goetz 在該消息中解釋了為什么這并不像最初看起來(lái)的那樣好,因?yàn)閖shell是為“良好的交互體驗(yàn)”而不是作為“批處理運(yùn)行程序”而明確設(shè)計(jì)的。 JEP草案的當(dāng)前版本在“ 替代方案”部分中對(duì)此進(jìn)行了說(shuō)明,其中指出:
我們可以將“一次性運(yùn)行”任務(wù)委托給
jshell工具。 雖然乍一看似乎很明顯,但這在設(shè)計(jì)時(shí)顯然是非目標(biāo)
jshell 。 的
jshell工具被設(shè)計(jì)為交互式外殼,許多設(shè)計(jì)決策都傾向于提供更好的交互式體驗(yàn)。 成為批處理運(yùn)行程序的額外限制會(huì)加重它的負(fù)擔(dān),從而降低交互體驗(yàn)。
盡管目前這只是JEP的草案 ,但我很喜歡這個(gè)想法,并認(rèn)為將其添加到JDK的未來(lái)版本中將是一個(gè)很好的次要功能。 此功能將使Java新手可以更輕松地測(cè)試基本Java示例,并且不會(huì)給Java新手增加他或她不習(xí)慣與某些其他(通常是動(dòng)態(tài)類型的)編程語(yǔ)言一起使用的額外步驟。 對(duì)于經(jīng)驗(yàn)豐富的Java開(kāi)發(fā)人員來(lái)說(shuō)也很方便。 我仍然發(fā)現(xiàn)自己寫了一些Java小片段來(lái)學(xué)習(xí)某些東西的工作原理(并向他人演示它是如何工作的),而該草案建議的JDK增強(qiáng)功能將使其變得更容易一些,尤其是當(dāng)Java源文件編譯成多個(gè).class文件時(shí)。 這是我在Groovy開(kāi)發(fā)中喜歡的功能之一,并且對(duì)于簡(jiǎn)單的Java開(kāi)發(fā)而言,它會(huì)很不錯(cuò)。
翻譯自: https://www.javacodegeeks.com/2018/02/executing-single-java-source-files-one-command.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的使用一个命令执行单个Java源文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 娇韵诗备案号(娇韵诗备案)
- 下一篇: Java更快地对基元数组进行排序?