【问题标题】:How do I run Java .class files?如何运行 Java .class 文件?
【发布时间】:2011-08-11 01:27:52
【问题描述】:

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

【问题讨论】:

  • 除了艾萨克对您问题的回答。将“java”写成小写可能是个好主意,因为大写仅适用于 MS Windows。

标签: java compilation


【解决方案1】:

你需要设置类路径才能找到你编译的类:

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

【讨论】:

  • 它可以在我的文件结构中的任何位置完美运行。只需将编译类的路径放入 -cp 参数中,然后将编译后的类名放入没有任何路径。如果你和你编译的类在同一个文件夹中,你也可以在没有 -cp 参数的情况下运行这个类。
【解决方案2】:

要从命令行运行Java class file,语法是:

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

其中 packageName(通常以 comorg 开头)是您的类文件所在的文件夹名称。

例如,如果您的主类名称是 App 并且您的应用程序的 Java package namecom.foo.app,那么您的类文件需要在 com/foo/app 文件夹中(每个点的单独文件夹),所以您运行您的应用程序为:

$ java com.foo.app.App

注意:$表示shell提示符,输入时忽略它

如果您的班级没有定义任何 package 名称,只需运行为:java App

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


实际例子

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

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

我们已经通过mvn compilemy-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 将不起作用。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      1. 转到保存要编译的 java 文件的路径。
      2. 输入 cmd 替换路径,然后按回车键。
      3. 会弹出命令提示目录,其中包含C:/blah/blah/foldercontainJava之类的路径文件
      4. 输入javac javafile.java
      5. 按 Enter。会自动生成java类文件

      【讨论】:

      • 问题是关于运行类文件,而不是如何生成它。
      猜你喜欢
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      相关资源
      最近更新 更多