场景描述: 为工作中需要, 我这边负责将原有项目(例如:Project)引入一个内嵌的Tomcat,实现目标:Project.war可以放在Tomcat/Was等容器中运行,也可以在一台只安装有JDK的机器上运行; 所以我这边计划引入EmbedTomcat7来实现,首先在apache的官网下载了apache-tomcat-7.0.54-embed,并在Project的WEB-INF下面新建EmbedServer目录,引入了启动的配置文件(conf目录)和jar包(lib目录);写了War包的启动类(Main.java)和Tomcat启动类(EmbeddedTomcat.java),在Main.java中,首先将war解压到指定目录,然后通过反射调用EmbeddedTomcat来启动服务;
问题描述: 在调用EmbeddedTomcat时,我这边用自定义URLClassLoader来装载EmbeddedTomcat.class和所需要的jar包,代码如下:
//设置classpath
URL classUrl= new File("D:/Proj/Proj/WEB-INF/classes").toURL() ;
//EmbedTomcat依赖Jar包 这里省略其他jar...
URL jarFile1 = new File("D:/Proj/Proj/WEB-INF/embedded-runtime/lib/tomcat-embed-core.jar").toURL();
URL jarFile2 = new File("D:/Proj/Proj/WEB-INF/embedded-runtime/lib/ecj-P20140317-1600.jar").toURL();
URLClassLoader urlClassLoader=new URLClassLoader(new URL[]{jarFile1,jarFile2,classUrl},originalContextCL);
//设置到当前线程
currThread.setContextClassLoader(urlClassLoader);
Class invoked_class = urlClassLoader.loadClass("com.server.EmbeddedTomcat");
//设置参数param_types和method_params 省略...
Method main = invoked_class.getDeclaredMethod("main", param_types);
//启动服务
main.invoke(invoked_class.newInstance(), method_params);
问题来了,我在Eclipse中对Main进行run as Application 是可以正常运行,但是通过脚本运行war文件却有如下错误:
严重: End event threw exception
java.lang.ClassNotFoundException: org.apache.catalina.deploy.ServletDef
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:846).....
EmbedTomcat7(内嵌版本)启动失败,找不到类(org.apache.catalina.deploy.ServletDef)
答案:2 悬赏:60 手机版
解决时间 2021-03-17 14:56
- 提问者网友:喧嚣尘世
- 2021-03-16 20:51
最佳答案
- 五星知识达人网友:封刀令
- 2021-03-16 21:24
缺少jar包,或者jar包没有放到正确的路径下,一般情况下放到WEB-INF/lib目录下面就可以
全部回答
- 1楼网友:傲气稳了全场
- 2021-03-16 22:09
java.lang.classnotfoundexception: org.apache.struts2.tiles.strutstileslistener
缺少jar包没有引用
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯