java - java和javac的机制是什么?
问题描述
经过很长时间的一些java相关工作,我刚刚拿起我的Ubuntu机器,发现我已经安装了 java 但没有安装 javac。
我用一个主要方法和一个简单的打印语句制作了一个Test.java文件。我在终端上写了这个:
java Test.java
我希望没有javac这不应该编译和运行,但它会在我的控制台上打印输出。然后我安装了一个JDK来启用javac并运行它:
javac Test.java
这创建了一个Test.class文件。仍然要运行我需要输入的 Test 类,java Test.java
并且在输入java Test
时会抛出java.lang.NoClassDefFoundError。
有人可以向我解释这些命令的背景发生了什么吗?编辑:这是我的 Test.java 的内容:
package Learning;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello World!");
}
}
解决方案
您在这里体验到的是为 Java 11 添加的新功能:
在 Java SE 11 中,您可以选择直接启动单个源代码文件,而无需中间编译。只是为了您的方便,让像您这样的新手不必运行 javac + java (当然,让他们感到困惑为什么会这样)。
从这里引用。有关更多详细信息,请参阅相应的 JEP 330。
所以:如果您有一个独立的 .java 文件……那么java二进制文件会识别、编译并直接运行它(使用 Java 11 或更新版本时)。
但请记住:这只是一种快速运行单个类的方法。它并不是要取代“真实”的做事方式。
一般来说,你还是javac
先用,再用java
。或者,更真实的世界:您使用构建系统,在其中描述要构建的内容,然后构建系统javac
在幕后为您调用。
推荐阅读
- angular - 'npm i @auth0/angular-jwt' 中不存在 angular2-jwt 中的 AuthHttp 类
- node.js - CLI 应用程序(用 Node 编写)应该在哪里缓存东西?
- c# - 将复杂的类写入文件?
- ssl - 用于数据连接的 FTPS 客户端程序
- vba - 工作表的变量名
- c++ - 将图像复制到另一个图像的部分
- c# - 在 IIS 上托管 .NET Core API + 网站
- c - 如何使用 yarpgen 随机 C 程序生成器?
- smalltalk - 在 Centos 7.4x 上将 OSSubprocess 添加到我的 Pharo 6.1 时出错
- c# - 如何从配置文件加载统一设置?