如何运行Java .class文件?

Ski*_*izz 63 java compilation

我编译了一个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.
Run Code Online (Sandbox Code Playgroud)

我期待看到一个HelloWorld打印出来.我究竟做错了什么?我安装了JDK.

Isa*_*ett 84

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

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

  • @Václav 将路径直接设置为包含类文件的文件夹仅在没有包的情况下有效。大多数项目应该定义一个包,因此类路径必须设置为编译结构的根,即答案中的“bin”。 (2认同)

ken*_*orb 32

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

java -classpath /path/to/jars <packageName>.<MainClassName>
Run Code Online (Sandbox Code Playgroud)

其中packageName(通常以com或开头org)是您的类文件所在的文件夹名称.

例如,如果你的主类名为App和Java包名是你的应用程序中com.foo.app,那么你的类文件需要在com/foo/app文件夹中(分别为每点文件夹),那么你运行你的应用程序为:

$ java com.foo.app.App
Run Code Online (Sandbox Code Playgroud)

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

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

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


实际的例子

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

$ mvn archetype:generate -DgroupId=com.foo.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 
Run Code Online (Sandbox Code Playgroud)

我们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!
Run Code Online (Sandbox Code Playgroud)

要仔细检查类和包名,可以使用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[]);
}
Run Code Online (Sandbox Code Playgroud)

注意:javap如果已编译的文件已被混淆,则无效.