如何运行 Java .class文件?

2022-08-31 10:51:37

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


答案 1

您需要设置类路径以查找已编译的类:

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


答案 2

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

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

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

例如,如果主类名是 App,而应用的 Java 包名称是 ,则类文件需要位于文件夹中(每个点的单独文件夹),以便以以下方式运行应用:com.foo.appcom/foo/app

$ java com.foo.app.App

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

如果您的类未定义任何名称,只需运行如下:。packagejava App

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


实例

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

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

并且我们已经在我们的dir中编译了我们的项目,它将生成我们的类文件在.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将不起作用。


推荐