互联网上的大多数网站都说:
“使用javac
命令编译.java
文件。然后使用java
命令运行它”
但是今天我试着运行一个没有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
命令?
我的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)
要回答为什么给出这个错误,文件的类名必须与文件的basename
匹配。
对于传统的javac
,有两个选项可以让此代码工作<代码>java顺序:
>
将类重命名为公共类Hello
或
将hello.java
重命名为myclass.java
。
Java11的java
解释器不强制执行此要求。包含main
的类可以有任何名称,只要它是文件中的第一个类。这主要是为了简化初学者的学习过程,并允许“java脚本”与sheang(参考文献。)。
如果您运行的是Java11,那么有一个新特性允许单源文件执行。单源编译器在类名和文件名方面更加混乱,因此这就是您能够运行但无法成功编译的方式。
如果您使用的是以前版本的Java,那么您当前的hello.Java不会编译,因为编译错误,特别是在类名周围。所以调用java hello.java绝对不可能编译代码,因为它不编译。
在执行java命令时,很可能您正在运行一些以前编译过的代码。
在Java11之前,要运行代码,必须先编译代码,然后才能运行它。下面是一个例子:
javac test.java
java test
从Java11开始,你仍然可以做javac
java
,或者你可以自己运行java
来编译和自动运行你的代码。请注意,不会生成. class
文件。这里有一个例子:
java test.java
如果运行java-help
,您将看到各种允许的用法。这是我的机器上的样子。最后一个是您遇到的:java[options]
$ 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命令?
我们需要
javac
的原因是创建.class
文件,这样代码就可以像今天一样被创建、测试、分发、运行、共享等等。JEP330的动机是在不改变任何其他现有用途的情况下,使“学习Java的早期阶段以及编写小型实用程序时”变得更容易。
本文向大家介绍java编译命令基础知识点,包括了java编译命令基础知识点的使用技巧和注意事项,需要的朋友参考一下 我们在对计算机下达指令时,人类的语言它是不能够明白,需要通过编译的时候翻译成计算机能听懂的语言。编译过程中会调用javac命令,这点大家可能接触的不多,毕竟是是计算机程序内部运行时的操作。下面我们就编译的概念、命令带来讲解,然后分享一个编译实例给大家练习。 1.编译概念 通过流程图可
我有两个java文件,(main.java,test.java)在每个文件中我编写了包ADT; 我在main.java内部编写了一个名为ADT的类,在我的test.java中将该类称为ADT。 有人能帮我吗?
我试图编译本文中的代码示例3,解释使用Gradle的Swing应用程序框架(JSR 296),并使用命令从命令行运行它。 我的目录布局如下所示: 构建。gradle文件定义了对appframework的依赖关系: 这是文件,上面提到的文章示例的副本,通过包声明增强: 使用gradle build编译工作正常,没有错误。 但是当我尝试使用 我收到错误消息: 当我用一个简单的“Hello,world!
这些命令在用途和功能性方面与 C 预处理器很相似。它们都允许文件内含,条件编译,可执行的头部封包,以及在构建进程期间处理执行。注意:这些命令都不允许使用变量。 5.1.1 !include [/NONFATAL] 文件 这个命令可以将一个文件包含到脚本中,就像是脚本的一部分一样。请注意,如果一个文件包含在了另一个目录中,那么当前目录仍是编译脚本的地方 (不是要包含的文件所在的目录)。如果编译器无法
问题内容: 截至2010年10月,GNU的Java编译器是否已失效?是否有任何有效的替代方法(特别是用于将Java编译为本地代码)? LLVM解决方案将是首选。 问题答案: 您可以使用IKVM和Mono的提前编译器生成本机代码。 编辑 此页面底部有一个示例。