我该如何运行Java .class文件?

99

我编译了一个HelloWorld程序,并使用命令提示符运行它。.class文件名为HelloWorld2.class

该文件位于C:\Users\Matt\workspace\HelloWorld2\bin中。当我打开命令提示符并输入"Java HelloWorld2"时,出现以下信息:

C:\Users\Matt>Java HelloWorld2
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld2
Caused by: java.lang.ClassNotFoundException: HelloWorld2
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: HelloWorld2.  Program will exit.

我本来期望看到打印出一个"HelloWorld"。我做错了什么?我已经安装了JDK。


10
除了艾萨克的回答之外,为你的问题加上一点建议。将“java”写成小写可能是个好主意,因为大写只适用于MS Windows操作系统。 - Hendrik Brummermann
请注意,Java 11及以上版本支持直接从单个.java文件运行。因此,您只需运行java HelloWorld2.java即可。 - John Gilmer
4个回答

116

如果你的类没有包名,你只需要设置classpath来找到你编译后的类:

java -cp C:\Users\Matt\workspace\HelloWorld2\bin HelloWorld2

如果你的类有包名,那么它需要在一个与包名相对应的目录中,并且classpath必须设置为代表该包的目录树的根目录。

// Source file HelloWorld2/src/com/example/HelloWorld2.java
package com.example;
...

Compiled class file: HelloWorld2/bin/com/example/HelloWorld2.class

$ java -cp HelloWorld2/bin com.example.HelloWorld2

它可以在我的文件结构中的任何位置完美运行。只需将编译后的类路径放入-cp参数中,然后将编译后的类名输入,不需要任何路径。如果您与已编译的类位于同一文件夹中,则也可以在不使用-cp参数的情况下运行此类。 - Václav
2
@Václav 直接将路径设置为包含类文件的文件夹仅适用于没有包的情况。大多数项目应该定义一个包,因此类路径必须设置为编译结构的根目录,即答案中的“bin”。 - Annan Yearian
@AnnanYearian 没错 - Václav

55

要从命令行运行Java类文件,语法如下:

java -classpath /path/to/jars <packageName>.<MainClassName>

packageName(通常以comorg开头)是包含你的类文件的文件夹名称。

例如,如果你的主类名为App,你的应用程序的Java包名称com.foo.app,那么你的类文件需要在com/foo/app文件夹中(每个点都有一个单独的文件夹),因此可以这样运行你的应用程序:

$ java com.foo.app.App

注意:$ 是表示 shell 提示符,输入时请忽略。

如果你的类没有定义任何package名称,只需运行:java App

如果你有其他的 jar 依赖项,请确保你已经指定了 classpath 参数,可以使用 -cp/-classpath 或者使用指向包含你的jar/war/ear/zip/class文件的文件夹的CLASSPATH变量。因此,在 Linux 上,你可以在命令前加上:CLASSPATH=/path/to/jars,在 Windows 上,你需要将文件夹添加到系统变量中。如果未设置,则用户类路径包括当前目录(.)。


实际例子

假设我们使用Maven创建了一个示例项目:

$ mvn archetype:generate -DgroupId=com.foo.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 

我们已经在my-app/目录中通过mvn compile编译了项目,它将生成我们的类文件在target/classes/com/foo/app/App.class中。

要运行它,我们可以通过-cp指定类路径或直接进入该目录,查看以下示例:

$ find . -name "*.class"
./target/classes/com/foo/app/App.class
$ CLASSPATH=target/classes/ java com.foo.app.App
Hello World!
$ java -cp target/classes com.foo.app.App
Hello World!
$ java -classpath .:/path/to/other-jars:target/classes com.foo.app.App
Hello World!
$ cd target/classes && java com.foo.app.App
Hello World!

为了确认你的类和包名,你可以使用Java类文件反汇编工具,例如:

$ javap target/classes/com/foo/app/App.class
Compiled from "App.java"
public class com.foo.app.App {
  public com.foo.app.App();
  public static void main(java.lang.String[]);
}

注意:如果编译后的文件已经被混淆,javap 将无法工作。

2

这可能意味着很多事情,但最常见的是文件中包含的类与文件本身的名称不同。因此,请检查您的类是否也被称为HelloWorld2。


-5
  1. 进入你保存 Java 文件的路径。
  2. 输入cmd并按回车键。
  3. 命令提示符目录会弹出,其中包括路径文件,例如C:/blah/blah/foldercontainJava
  4. 输入javac javafile.java
  5. 按回车键。它将自动生成 Java 类文件

1
问题是关于运行类文件,而不是如何生成它。 - ingomueller.net

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接