如何运行 Java .class 文件?

新手上路,请多包涵

我编译了一个 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。

原文由 Skizz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 638
2 个回答

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

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

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

 // 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

原文由 Isaac Truett 发布,翻译遵循 CC BY-SA 4.0 许可协议

要从命令行运行 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 依赖项,请确保您使用 — -cp / -classpath 或使用 CLASSPATH 变量指向的文件夹 jar / war / ear / zip / 文件。因此,在 Linux 上,您可以在命令前加上: CLASSPATH=/path/to/jars ,在 Windows 上,您需要将文件夹添加到系统变量中。如果未设置,则用户类路径包含当前目录 ( . )。


实例

鉴于我们已经使用 Maven 创建了示例项目:

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

我们已经通过 mvn compile 在我们的 my-app/ 目录中编译了我们的项目,它将生成我们的类文件在 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 如果编译的文件已经被混淆,将无法工作。

原文由 kenorb 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题