在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
请问要怎么编译和运行才能让虚拟机找到主类并成功运行?