尽管添加对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

Shebang来Java了吗?相关推荐

  1. java11 是长期支持_这里有你不得不了解的Java 11版本特性说明

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  2. jdk12源代码文件_JDK 11:轻松取出单文件Java源代码程序

    jdk12源代码文件 JDK 11 Early Access Builds包含与JEP 330相关的预览功能("启动单个文件源代码程序"). 我之前在" Shebang即 ...

  3. shebang_Shebang来Java了吗?

    shebang 尽管添加对Unix风格的shebang ( #! )的支持从来不是 JEP 330 ["启动单文件源代码程序"]的主要目标,但围绕JEP 330"单个文件 ...

  4. JDK 11:轻松取出单文件Java源代码程序

    JDK 11 Early Access Builds包含与JEP 330相关的预览功能("启动单个文件源代码程序"). 我之前在" Shebang即将来到Java? &q ...

  5. Java 11:运行单文件程序和“ shebang”脚本

    在Java 11中,对java启动器进行了增强,使其可以直接运行单文件源代码程序,而不必先对其进行编译. 例如,考虑以下仅添加其参数的类: import java.util.*; public cla ...

  6. Java 11 正式发布!

    有多少语言在提刀想反超 Java 的路上?但万万没想到,人家并未当回事,如今这款常青藤甚至越跑越欢,当我们还在使用 Java 7/8 时,它已经一路跑到了 11. 和预期的时间差不多,北京时间 9 月 ...

  7. Java 11 快要来了,编译 运行一个命令搞定!

    Java 11 马上要来了,原定于 9 月发布,还有不到 3 个月了,敬请期待更多新功能被加入到 11 当中,本文本讲的是 JEP 330 这个新特性. 化繁为简,一个命令编译运行源代码 看下面的代码 ...

  8. java groovy jar包_如何将jar包包含在groovy脚本中?

    如果你真的需要,你也可以在运行时加载一个JAR: this.getClass().classLoader.rootLoader.addURL(new File("file.jar" ...

  9. java opentsdb 链接 池_如何使用tCollector通过Java在OpenTSDB中添加数据

    我的目标是通过Java代码直接将数据插入TSDB,为此,我尝试创建将数据打印到STDOUT的可执行jar.然后,我编写了收集器以运行此jar,并将其放入tcollector / collectors ...

最新文章

  1. iOS Swift编程语言
  2. CentOS-6.2编译Qtopia-2.2.0
  3. 爱国者强烈推荐:nanopiR1——你懂的功能,懂你的开发板
  4. python课本第三章答案idle_第三天任务 (【基于Python编程从入门到实践】第三章 列表 书本及动手试一试)...
  5. 《简明电路分析》——导读
  6. linux将字符串转小写_小猿圈总结Linux常见命令(一)
  7. [恢]hdu 2317
  8. Keil综合(01)一些常见文件类型的作用和功能说明
  9. php echo 大括号,PHP中echo输出中存在括号()的处理
  10. 带你手撸红黑树,高级Java开发必看
  11. 数据的增删改_准备数据
  12. 电阻电容电感PCB封装真实尺寸大小
  13. 开发团队人员配备与角色分配
  14. jupyter notebook环境配置
  15. gcc -O0 -O1 -O2 -O3 -Os 编译优化等级
  16. 动态拨号vps有什么作用?
  17. 【Scratch画图100例】图39-scratch实心圆 少儿编程 scratch编程画图案例教程 考级比赛画图集训案例
  18. 女人要记住的亦舒75句话
  19. Mysql中的七种常用查询连接详解
  20. java实现消息提醒功能,终于彻底把握了

热门文章

  1. springboot整合spring @Cache和Redis
  2. 汇编语言(二十五)之成绩分段统计
  3. 在比特币世界中矿工的作用是什么
  4. Oracle入门(五C)之68个系统变量的key和默认value
  5. JDK8的排序大法!!
  6. MySQL笔记汇总---狂神说
  7. 蓝桥杯JAVA省赛2013-----B------4(黄金连分数)
  8. MySQL的自然联结+外部联结(左外连接,右外连接)+内部联结
  9. jetty java_Jetty,Java和OAuth入门
  10. java hipster!_通过Java Hipster升级Spring Security OAuth和JUnit测试