互联网上的大多数网站都说:

"use the 100 command to compile a 101 file. Then run it using the 102 command"

但今天我try 运行一个没有javac的java程序,结果很奇怪.

以下是名为hello.java的文件的内容:

public class Myclass {
 public static void main(String[] args){
    System.out.println("hello world");
  }
}

然后我跑了起来:

$ javac hello.java

这给了我一个错误:

hello.java:1: error: class Myclass is public, should be declared in a file named Myclass.java
public class Myclass {
       ^
1 error

但当我在没有javac命令的情况下运行它时,它执行时没有任何错误.

$ java hello.java
hello world

java命令是否也编译该程序?如果是,为什么我们需要javac命令?

my java的版本是:

openjdk version "12.0.2" 2019-07-16
OpenJDK Runtime Environment (build 12.0.2+10)
OpenJDK 64-Bit Server VM (build 12.0.2+10, mixed mode)

推荐答案

在Java11之前,要运行代码,必须先编译代码,然后才能运行它.下面是一个例子:

javac test.java
java test

从Java11开始,您仍然可以执行javac+java,或者您可以单独运行java来编译和自动运行您的代码.请注意,不会生成.class文件.下面是一个示例:

java test.java

如果你跑java -help,你会看到各种允许的用法.这是我的机器上的样子.最后一个是您遇到的:java [options] <sourcefile> [args],它将"执行单个源文件程序".

$ java -help
Usage: java [options] <mainclass> [args...]
           (to execute a class)
   or  java [options] -jar <jarfile> [args...]
           (to execute a jar file)
   or  java [options] -m <module>[/<mainclass>] [args...]
       java [options] --module <module>[/<mainclass>] [args...]
           (to execute the main class in a module)
   or  java [options] <sourcefile> [args]
           (to execute a single source-file program)

UPDATE:

正如@BillK指出的那样,OP还问道:

why do we need the javac command?

我们需要javac的原因是创建.class个文件,这样代码就可以像今天一样被创建、测试、分发、运行、共享等等.JEP 330的动机是在不改变任何其他现有用途的情况下使"early stages of learning Java, and when writing small utility programs"更容易使用.

Java相关问答推荐

如何在Java中对自定义协议进行主机名验证?

基于仅存在于父级中的字段查询子文档?

Java事件系统通用转换为有界通配符

Java WireMock定义存根在Cucumber并行执行的多线程测试中失败

Kubernetes的Java客户端检索状态.处于终止状态的Pod的阶段';正在运行';

RESTful框架类字段是安全的还是不安全的

如何确定springboot在将json字段转换为Dto时如何处理它?

具有阻塞方法的开源库是否应该为执行提供异步选项?

将java.util.Date转换为OffsetDateTime

在处理2个映射表时,没有更多的数据可从套接字读取

如何用内置Java从JavaFX应用程序中生成.exe文件?

如何在透视表中添加对计数列的筛选?

如何使用MapStrCut转换双向链接

Spring Validator批注不起作用

泛型与泛型问题的完美解决方案?

在应用程序运行时更改LookAndFeel

Java类型推断:为什么要编译它?

Java CDI:@Singleton@Startup@Inject无法实现接口

为什么我的登录终结点不能被任何请求访问?

转换为JSON字符串时,日期按天递减-Java