为何会“找不到或无法加载主类”?

平时开发时都是使用IDE运行java程序,但是当程序打包部署到服务器后,需要从命令行来启动,通过java 类名java -jar jarfile命令来运行,初学者经常会遇到找不到或无法加载主类的错误。下面是一个例子。

在helloapp/com/hello目录下创建一个HelloWorld.java

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

进入hello目录,通过javac HelloWorld.java编译生成HelloWorld.class,再通过java HelloWorld执行,能正常输出结果。

现在在类前面加上包名:

package com.hello;
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

重新编译之后再执行就会报错:

d:\test\helloapp\com\hello>java HelloWorld
错误: 找不到或无法加载主类 HelloWorld

java命令运行一个类,需要指定类的全限定名,即完整的包名+类名,使用全限定名之后依然报错:

d:\test\helloapp\com\hello>java com.hello.HelloWorld
错误: 找不到或无法加载主类 com.hello.HelloWorld

这是因为java命令执行时默认以当前路径为类搜索路径(类路径),它搜索当前目录下com\hello\HelloWorld.class文件,完整路径就是d:\test\helloapp\com\hello\com\hello\HelloWorld.class,当然找不到这个文件。

解决办法是使用-cp选项指定类路径,告诉jvm应该从helloapp目录开始搜索类:

d:\test\helloapp\com\hello>java -cp d:\test\helloapp com.hello.HelloWorld
Hello World

或者不指定类路径,在包名的上一层目录(helloapp)中执行:

D:\test\helloapp>java com.hello.HelloWorld
Hello World

参考:
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/toc.html


版权声明:本文为u012254277原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。