本文视频源:
Youtube:https://youtu.be/Trw_jqRWKlc
Youku:https://v.youku.com/v_show/id_XNDA4NTI1NjA4OA==.html
虽然现在很少使用 Java 进行开发,但是仍然时不时的关注着它的动态,最近发现 Java 11 发布了,并且带来了很多新特性,关键它是 Java8 以后又一长期维护版本,可以在生产环境使用,这又增加了我关注它的动力,今天先介绍一个新特性:java 命令可以直接运行单文件。
运行单文件
举个例子,写一个类文件 HelloWorld.java
1  | public class HelloWorld{  | 
以前需要这样运行
1  | $ javac HelloWorld.java  | 
现在只需要这样
1  | $ java HelloWorld.java  | 
嗯,Python 你闭嘴,还有你 Go。呵呵
为什么?
其他介绍 Java 11 新特性的文章,到这里也就点到为止了,但是我总觉得这事不是这么简单。
Java 为什么要这么做,真的是想用 java 取代 javac 吗,很显然不是,你可以做些实验,再多文件打包运行时,我们仍然需要 javac 来进行编译,也就是说 java 有其他的用途。
这几年 Java 一直在追赶脚本语言(如:Python、NodeJS)的脚步,比如 lambda 函数、服务器组件、轻量级的 JSON 组件,还有 Java 11 才增加的 Http Client Api。这无疑都在想让自己往脚本语言方向发展,并且现在已经越来越像了。
我们来做一些对比,拿入门的打印 Hello World 来举例,在 Python 中我们这样
1  | #!/usr/bin/env python  | 
Java 中这样
1  | public class Hello{  | 
好了,先不要笑,也先不要管 public, static, void 是个什么东西,Java 一直都很臃肿,你又不是不知道,至少现在它已经把 javac Hello.java 干掉了。
脚本运行
脚本语言的特性是可以在文件第一行以 #! 开头,并指定运行命令,然后可以直接在终端中运行,比如 Python
1  | $ chmod +x hello.py  | 
那 Java 呢,因为本身的特性,.java 后缀的文件不运行出现 #!,所以我们首先需要改一下名字,听到这里,你是不是已经开始心跳加速了。
1  | $ mv Hello.java hello.sh  | 
然后修改文件
1  | #!/usr/bin/env java --source 11  | 
然后执行该文件
1  | $ ./hello.sh  | 
啊!我看到了什么,这真的是 Java 吗?
OK,现在为止,已经挑战了我的认知,这有悖于我们多年以来的认知。
当然文件还可以使用 java 运行
1  | $ java -Dtrace=true --source 11 hello.sh  | 
同一个文件多个公共类
我们刚才已经知道了两个有悖“常识”的知识点Java 可以作为脚本运行和文件名可以和第一个公共类名不相同
看到第二点,我有个大胆的想法。
1  | public class HelloWorld{  | 
这样的写法,如果放在几个月以前,是会被别人破口大骂的,因为只学过几天的菜鸟也知道,一个类中不能出现两个公共类,它会报这个错误。
1  | error: class User is public, should be declared in a file named User.java  | 
你把 User 类前边的 public 去掉就行了,那在 Java 11 中呢
1  | $ java hello.java  | 
现在 Java 11 会正常运行该文件,并直接第一个公共类的 main 函数。
好吧,这确实颠覆了 20 几年来 Java 固守的东西,还有对于新手来说,这真的是一个痛苦的过程。
最后我们再来总结一下,在单文件运行的情况下 Java 11 做了哪些改变
- Java 11 可以将单文件作为脚本来运行
 - 文件名不在需要跟第一个公共类名相同
 - 同一个文件下可以存在多个公共类
 - 单文件下不再需要 class 文件
 
参考: