我如何运行Java .class文件?
我编译了一个HelloWorld程序,并使用命令提示符来运行它。 .class文件名为HelloWorld2.class
该文件位于C:\ Users \ Matt \ workspace \ HelloWorld2 \ bin下面是我进入命令提示符时input“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。
你需要设置类path来find你编译的类:
java -cp C:\Users\Matt\workspace\HelloWorld2\bin HelloWorld2
要从命令行运行Java类文件 ,语法是:
java -classpath /path/to/jars <packageName>.<MainClassName>
其中packageName(通常以com
或org
开头)是您的类文件所在的文件夹名称。
例如,如果您的主类名称是App,并且您的应用程序的Java包名称是com.foo.app
,那么您的类文件需要位于com/foo/app
文件夹(每个点的单独文件夹)中,因此您可以运行应用程序如:
$ java com.foo.app.App
注意: $
表示shell提示符,input时忽略它
如果你的类没有定义任何package
名,只需运行: java App
。
如果你有任何其他的jar依赖项,请确保你使用-cp
/ -classpath
指定了你的classpath参数,或者使用指向jar / war / ear / zip / class文件的文件夹的CLASSPATH
variables来指定你的classpath参数。 因此,在Linux上,您可以在命令前加上: CLASSPATH=/path/to/jars
,在Windows上,您需要将该文件夹添加到系统variables中。 如果未设置,则用户类path由当前目录( .
)组成。
实际的例子
鉴于我们使用Maven创build了示例项目,如下所示:
$ mvn archetype:generate -DgroupId=com.foo.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
而且我们已经通过mvn compile
我们的my-app/
dir来编译我们的项目,它会生成我们的类文件在target/classes/com/foo/app/App.class
。
要运行它,我们可以通过-cp
指定类path或者直接去它,检查下面的例子:
$ 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
将不起作用。
这可能意味着很多事情,但最常见的是文件中包含的类与文件本身不具有相同的名称。 所以,检查你的类是否也叫做HelloWorld2。