“java”命令是否编译 Java 程序?

2022-08-31 07:36:51

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

“使用 javac 命令编译.java文件。然后使用java命令运行它”

但是今天我试图在没有java程序的情况下运行,我得到了一个奇怪的结果。javac

以下是名为: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

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

我的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)

答案 1

在Java 11之前,要运行代码,您必须首先编译它,然后才能运行它。下面是一个示例:

javac test.java
java test

从 Java 11 开始,您仍然可以执行 + ,或者您可以自行运行来编译和自动运行代码。请注意,不会生成任何文件。下面是一个示例:javacjavajava.class

java test.java

如果运行 ,您将看到各种允许的用法。这是它在我的机器上的样子。最后一个是你遇到的:它将“执行单个源文件程序”。java -helpjava [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)

更新:

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

为什么我们需要javac命令?

我们需要的原因是创建文件,以便可以像今天一样创建,测试,分发,运行,共享等代码。JEP 330的动机是使“学习Java的早期阶段和编写小型实用程序”更容易,而无需改变任何其他现有用途。javac.class


答案 2

如果您正在运行 Java 11,那么有一项新功能允许执行单个源文件。单源编译器在类名与文件名方面更加混杂,因此这就是您能够运行但无法成功编译的方式。

如果您使用的是以前版本的 Java,那么您当前的 hello.java 不会编译,因为编译错误,特别是在类名周围。因此,绝对没有办法调用java hello.java编译你的代码,因为它不会编译。

在执行 java 命令时,您很可能正在运行一些以前编译的代码。


推荐