运行 .class 或 .java 之间是否存在有意义的差异?
Is there a meaningful difference between running .class or .java?
我开始 Java,并且正在阅读来自 Oracle 的 "Hello World!" for Microsoft Windows 指南。在指南中,它告诉您使用javac 编译成.class,然后运行 和
java -cp . HelloWorldApp
当我尝试 运行 时,我没有 运行 正确的文件,而是不小心 运行
java helloworldapp.java
我注意到之后,我尝试了原来的方式,他们都打印了
Hello World!
这让我开始思考,运行编译后的 .class 与原始源代码 .java 有什么区别吗?
在 Java 11 中,现在可以 运行 'java <source_file>' 主要是为了帮助熟悉该语言:https://openjdk.java.net/jeps/330
在幕后,它首先编译源文件,然后 运行编译编译后的文件 class。对于更简单的用例(例如:1 个文件 java 程序,没有依赖项),行为可能是相同的,但值得注意的是,这并不意味着通常替代 'compile then execute' .
运行编译后的 .class
与原始源代码 .java
.
之间几乎没有区别
但是,直接 运行 .java
源文件的能力 很方便 ,并且有局限性:
最严重的限制是它只支持single-source程序。如果在多个源文件中有类,则无法使用此功能。
对指定编译器选项的支持有限。更高级的使用,需要直接调用编译器。
Re-running程序需要re-compiling源码,所以启动程序会慢一些。
但是,除了那些限制之外,除了只需要 运行 一个命令的便利之外,真的没有区别。
当然,因为您应该使用 IDE 开发 Java 程序,所以这并不重要。这意味着该功能恢复到其原始目的,如 JEP 330: Launch Single-File Source-Code Programs 中指定的那样,即 运行ning #!
shebang 脚本的目的。
我开始 Java,并且正在阅读来自 Oracle 的 "Hello World!" for Microsoft Windows 指南。在指南中,它告诉您使用javac 编译成.class,然后运行 和
java -cp . HelloWorldApp
当我尝试 运行 时,我没有 运行 正确的文件,而是不小心 运行
java helloworldapp.java
我注意到之后,我尝试了原来的方式,他们都打印了
Hello World!
这让我开始思考,运行编译后的 .class 与原始源代码 .java 有什么区别吗?
在 Java 11 中,现在可以 运行 'java <source_file>' 主要是为了帮助熟悉该语言:https://openjdk.java.net/jeps/330
在幕后,它首先编译源文件,然后 运行编译编译后的文件 class。对于更简单的用例(例如:1 个文件 java 程序,没有依赖项),行为可能是相同的,但值得注意的是,这并不意味着通常替代 'compile then execute' .
运行编译后的 .class
与原始源代码 .java
.
但是,直接 运行 .java
源文件的能力 很方便 ,并且有局限性:
最严重的限制是它只支持single-source程序。如果在多个源文件中有类,则无法使用此功能。
对指定编译器选项的支持有限。更高级的使用,需要直接调用编译器。
Re-running程序需要re-compiling源码,所以启动程序会慢一些。
但是,除了那些限制之外,除了只需要 运行 一个命令的便利之外,真的没有区别。
当然,因为您应该使用 IDE 开发 Java 程序,所以这并不重要。这意味着该功能恢复到其原始目的,如 JEP 330: Launch Single-File Source-Code Programs 中指定的那样,即 运行ning #!
shebang 脚本的目的。