java如何运行一个继承了不同包下类的.class文件。

在Idea中,我编写了一个OneServlet类继承了javax.servlet.http.HttpServlet,编译运行时报错 找不到主类OneServlet,

我修改了Module的设置,把tomcat的外部库的scope从provided设置为compile就可以运行了。

经过观察我发现scope为compile时Idea的运行指令中classpath比provide多了两个地址:

D:\apache-tomcat-8.0.50\lib\jsp-api.jar;D:\apache-tomcat-8.0.50\lib\servlet-api.jar

 

所以说scope为provide并没有考虑这个地址,导致找不到主类,但是找不到的是我自己的主类OneServlet,为什么会报这种错误?背后的原理是什么?Idea选择provide和compile逻辑上有什么不同吗?

我写了两个 类来模仿上面的问题,第一个类是base.Base,存在./path1/base/路径下,第二个类是sub.Sub,存放在./path2/sub/路径下,Sub继承了Base。源代码如下:

package base;
public class Base{
    public static void main(String[] args) {
        
    }
}
package sub;
import base.Base;
public class Sub extends Base{
    public static void main(String[] args) {
        System.out.println("In Sub");
    }
}

编译命令为:

javac ./path1/base/Base.java -d ./path1

javac ./path2/sub/Sub.java   -d ./path2  -cp "./path1;./path2"

 

执行Sub的命令为:

java sub.Sub -cp "./path1;./path2"

 

接着开始报错:

Error: Could not find or load main class sub.Sub

请问要怎么编译和运行才能让虚拟机找到主类并成功运行?

你这个报错是因为你自己定义的OneServlet继承了HttpServlet,但是没有将HttpServlet这个类加到运行时的classpath中,导致类加载时报错。

报错信息说的时could not find or load main class, 实际就是加载时验证报错,而不是找不到OneServlet这个类。

如果没有继承HttpServlet,只是在代码中用到HttpServlet,那就会报HttpServlet的ClassNotFound的异常。

后面写的两个类,编译结果的目录结构要和包名保持一致。