Kuze 2021-02-18 14:08 采纳率: 0%
浏览 127

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

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

  • 写回答

1条回答 默认 最新

  • 规则边缘 2021-02-18 14:57
    关注

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

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

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

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

    评论

报告相同问题?

悬赏问题

  • ¥15 怎么获取下面的: glove_word2id.json和 glove_numpy.npy 这两个文件
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug