尽管添加对Unix风格的shebang ( #!
)的支持从来不是 JEP 330 [“启动单文件源代码程序”] 的中心目标 ,但围绕JEP 330“单个文件源程序”的潜在功能存在一些问题。为了支持Unix风格的shebang ,在OpenJDK jdk-dev邮件列表上引起了广泛的讨论。 这场“激烈的讨论”导致Mark Reinhold对JEP 330 的审查期增加了一周 (现已于5月31日结束),以允许就针对JDK 330的JEP 330进行进一步的讨论。
尽管对于是否应该添加shebang支持仍存在一些分歧 ,但似乎共识已转移到一项提案,以明确区分常规的独立于平台的Java源代码文件(以扩展名.java
结尾的文件)和新的。 JEP 330“可执行”平台特定的“单文件源代码程序”。 明显的区别是值得注意的,因为它允许将Shebang表示在后者中(JEP 330可执行平台特定的单文件源代码程序),而不能在前者中使用(我们所使用的传统Java平台无关的源代码)。都习惯了)。
在此讨论中, 乔纳森·吉尔斯 ( Jonathan Giles)的一条消息指出“不想更改JLS或javac的各种原因”,并指出“ shebang脚本是在某些(但不是全部)平台上定义的可执行格式,”指出“创建shebang脚本通常不只是在文件中添加第一行”,还阐明了明确区分传统Java源代码和JEP 330可执行Java脚本的概念:
虽然将文件重命名为命令友好名称是可选的,但也希望将其重命名。 例如,名为“ HelloWorld.java”的源文件可能被安装为“ helloworld”。 而且,尽管JEP描述了使用`java HelloWorld.java'执行小型单文件程序或仅使用`helloworld`作为平台特定的shebang脚本执行的用例,但似乎并没有常见的用例执行`HelloWorld.java`。 因此,如果通常将shebang脚本重命名为命令友好的名称,则将无法使用“ javac helloworld”直接对其进行编译,因为这对于Javac而言不是有效的命令行。 这降低了使javac忽略shebang行的任何潜在便利。
由于Java源文件与特定于平台的可执行脚本是不同的工件,因此有区别地对待它们是有道理的,并且由于我们不想更改Java语言以支持shebang行,因此建议修改JEP和实现,以便shebang绝不会从Java源文件(即以`.java`结尾的文件)中删除行。 这就避免了处理Java源文件的工具生态系统必须处理诸如shebang行之类的任意工件的问题。 所做的更改仍将允许直接执行Java源文件(如java HelloWorld.java),以及执行shebang脚本(如helloworld)。
下表总结了与每种“ Java”文件样式相关的特征和优点。
项目 | 传统Java源文件 | JEP 330可执行单文件源代码程序 |
---|---|---|
内容描述 /名称 | “ Java源文件(以.java扩展名结尾) ” | “ 可执行脚本(不使用[ .java ]扩展名。) “ |
“ Java源文件 ” | “ shebang脚本 “ | |
“ Java源文件 ” | “ 包含Java代码的脚本 ”或“ 特定于平台的可执行脚本 ” | |
“ Java源文件,由以'.java'结尾的文件名标识 ” | ||
舍邦 | 不支持 | 支持的 |
平台 | 独立 | 依附 |
显式编译 | 是 | 没有 |
乔纳森·吉本斯(Jonathan Gibbons)总结了JEP 330的意图 :“这里的总主题不是将Java演变为脚本语言,而是使诸如Java启动器之类的工具更友好地支持在可执行文本文件中使用Java源代码,以便减少运行简单程序的仪式。”
讨论还涵盖了其他方法,例如binfmt_misc (另请参见此处 ),Unix风格的“ here文档 ”( 此处定义文档 ),“ 在Java启动器中支持'-'STDIN源 ”以及将Linux更改为支持“ la”。 -la-bang: //!
。
讨论中另一个有趣的旁注是Brian Goetz 对JEP 330如何达到其当前状态的“回顾” 。 他谈到了导致人们认识到的“无数小时聆听人们对Java的关注”,“人们表达关注的一个普遍主题是'激活能量'; 在Java中做简单的事情需要太多的固定工作。” Goetz指出,JShell和JEP 330是解决此问题的许多可能方法中的两种,并且这两种方法是在考虑“成本(在多个维度上)”后做出“关于哪种方法影响最大的主观选择”之后从众多方法中选择的。做出这些选择时的收益和利益(或我们对收益的主观估计)。”
因此,“常规Java”源代码文件将不会得到shebang的支持,但这并不是什么大问题,因为它们确实不需要它们。 但是,用Java编写的基于JEP 330的基于平台的依赖于可执行文件的单文件脚本似乎将在第一行中支持可选的shebang。 我们可能会在本周四之前知道JEP 330是否将针对JDK 11。
翻译自: https://www.javacodegeeks.com/2018/05/shebang-coming-java.html