0 0

新人报道,想请教各路大神一个EmbedTomcat7(内嵌版本)启动问题15

场景描述: 为工作中需要, 我这边负责将原有项目(例如: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解压到指定目录,然后通过自定义URLClassLoader装载EmbeddedTomcat来启动EmbedTomcat服务;

问题描述: 在调用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[]{classUrl,jarFile1,jarFile2....},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 是可以正常运行,但是通过脚本(启动脚本:java -DDEBUG -XX:PermSize=512m -Xmx512m -jar Project.war start )运行war文件却有如下错误:
2014-7-9 18:05:51 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-bio-8080"]
2014-7-9 18:05:51 org.apache.catalina.core.StandardService startInternal
信息: Starting service Tomcat
2014-7-9 18:05:51 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/7.0.54
2014-7-9 18:05:51 org.apache.catalina.startup.ContextConfig getDefaultWebXmlFragment
信息: No global web.xml found
2014-7-9 18:05:51 org.apache.tomcat.util.digester.Digester endElement
严重: 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)
        at org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:201)
        at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1063)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1774)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2930)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
        at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1561)
        at org.apache.catalina.startup.ContextConfig.parseWebXml(ContextConfig.java:1812)
        at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1250)
        at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:876)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:374)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5355)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)
2014-7-9 18:05:51 org.apache.catalina.startup.ContextConfig parseWebXml
严重: Parse error in application web.xml file at jndi:/localhost/Proj/WEB-INF/web.xml
java.lang.ClassNotFoundException: org.apache.catalina.deploy.ServletDef
        at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2711)
        at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2743)
        at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1066)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1774)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2930)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
        at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1561)
        at org.apache.catalina.startup.ContextConfig.parseWebXml(ContextConfig.java:1812)
        at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1250)
        at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:876)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:374)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5355)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)
2014-7-9 18:05:51 org.apache.catalina.startup.ContextConfig parseWebXml
严重: Occurred at line 25 column 12
2014-7-9 18:05:51 org.apache.catalina.startup.ContextConfig configureStart
严重: Marking this application unavailable due to previous error(s)
2014-7-9 18:05:51 org.apache.catalina.core.StandardContext startInternal
严重: Error getConfigured
2014-7-9 18:05:51 org.apache.catalina.core.StandardContext startInternal
严重: Context [/Proj] startup failed due to previous errors
2014-7-9 18:05:51 org.apache.catalina.loader.WebappClassLoader clearReferencesJd
bc
警告: JDBC driver de-registration failed for web application [/Proj]
java.lang.NullPointerException
        at org.apache.catalina.loader.WebappClassLoader.clearReferencesJdbc(WebappClassLoader.java:2071)
        at org.apache.catalina.loader.WebappClassLoader.clearReferences(WebappClassLoader.java:2007)
        at org.apache.catalina.loader.WebappClassLoader.stop(WebappClassLoader.java:1908)
        at org.apache.catalina.loader.WebappLoader.stopInternal(WebappLoader.java:661)
        at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
        at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5702)
        at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)
2014-7-9 18:05:51 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-bio-8080"]

我想主要是由于EmbeddedTomcat7所依赖的JAR包没有正常加载而引起的,如果将这些jar包放到jre/ext中便可以正常启动,也可以在解压后的目录中写一个bat脚本 -cp classpath 启动, 但总感觉不是一个优雅的做法,所以想请问各路大神,如何从根本上去除上述启动错误?是否有更加方便的处理方式? 顺便普及一下Tomcat的装载及运行原理, 万分感谢!

问题补充:我尝试过将EmbedTomcat依赖的Jar和EmbeddedTomcat.class打到一个jar中, 结果还是同样的错误,难道真的无解了???

问题补充:目前只能通过bat脚本解决了, 读取参数 → 效验目录 → 解压war包 → 设置classPath → 启动server  不甘心啊
2014年7月09日 22:30
目前还没有答案

相关推荐

    IT各路大神对云安全知识的实践和分享.rar

    IT各路大神对云安全知识的实践和分享

    CocosCreator源码资源CocosCreator各路大神直播视频教程32G

    这对于需要大量稳定网络环境或者想要随时随地学习的用户来说,无疑提供了一个便捷的途径。 值得注意的是,尽管网络上有许多免费资源可供学习,但对于初学者而言,系统的视频教程能够提供更加直观的学习体验,有助于...

    近百篇关于图像深度学习的论文列表集合(各路大神论文、模型发表论文)

    截止到2019/07/14日之前的,各路大神关于图像处理、深度学习的论文索引,包括多种经典的神经网络模型的具体阐述。

    sql练习题 忘各路大神改正

    基本上答案都是对的,有个别的有点小问题,还希望改正

    PlayAndroid:第一个涉及网络获取数据的Android应用,慢慢来,应该可以从各路大神学到很多知识

    第一个涉及网络获取数据的Android应用,慢慢来,应该可以从各路大神学到很多知识 增加了本地数据库的注册登陆功能,使用了郭神的litepal框架。 增加了一个循环的线程,一直在监听用户是否登陆,如果登陆的话进行则...

    电脑主机不启动

    电脑主机无法正常启动的问题,是日常使用中最常见的故障之一。本文将从给定的文件信息出发,深入分析导致这一问题的原因,并提供详细的排查步骤与解决方法。 #### 环境因素检查 **温度与湿度:** 检查所在环境的...

    华硕猛禽版的GTX750ti bios (STRIX-GTX750TI-OC-2GD5)

    其他品牌同版本的显卡,例如技嘉、凄惨红都没这个问题。网上也有大神刷了palit 的bios解决问题的,但是显卡频率、风扇都会有一些问题。 经过爬文,发现刷华硕猛禽版的750ti bios (STRIX-GTX750TI-OC-2GD5)可以完美...

    华硕 GTX 750Ti-OC-2GD5 解决DVI HDMI输出问题

    其他品牌同版本的显卡,例如技嘉、凄惨红都没这个问题。网上也有大神刷了palit 的bios解决问题的,但是显卡频率、风扇都会有一些问题。 经过爬文,发现刷华硕猛禽版的750ti bios (STRIX-GTX750TI-OC-2GD5)可以完美...

    产品经理与产品运营谁更有前景?看看各路“大神”怎么说.pdf

    在鹅厂(腾讯)这样的公司,产品策划和产品运营是产品经理职业通道下的两个不同岗位,产品运营在某种程度上被视为产品经理职能的一个分支。产品策划主要关注产品的核心功能和用户体验,而产品运营则负责产品上线后的...

    易语言组件美化例程 窗口子类化 子类化选择列表框

    主要是最近想练手然后想要一个这样的组件 。然后找了找网上也没有我想要的 然后想自己画一个 一开始想单纯的重新画一个组件的 但是实力不足装不了这个*。那只能子类化了 之前有了解过一点点 这次的代码也基本参照的...

    269道各路算法考试题集锦

    狼追兔子问题则是一个周期性模式问题,需要理解其中的循环性质;数学家存活问题和礼物分配问题则可能需要应用数学归纳法和中国剩余定理等数学工具。 代码实现类题目,如分解数字的函数和最小公倍数的查找,直接将...

    Vue2全家桶仿微信App项目,支持多人在线聊天和机器人聊天.zip

    更新说明"vue": "^2.5.2","vue-router": "^3.0.1","vuex": "^3.1.0""webpack": "^4.17.1",前言这个项目是利用工作之余写的一个修改微信app的单页面应用还是整个项目包含27个页面,涉及实时群聊,机器人聊天,同学录...

    Blender建模高级教程

    本文主要分功能模块全面介绍一下 Blender ,同时会介绍一些非常能打的参数化和节点化插件,例如早已内嵌到Blender里面的 Tissue(免费),俄罗斯大神们开发的 Sverchok(免费),在Geometry nodes 成熟前就已经非常...

    通达信各路资金博弈指标.doc

    通达信各路资金博弈指标 ...通达信各路资金博弈指标是一个复杂的技术指标,涉及到多种计算公式和技术指标。了解这些计算公式和技术指标对于投资者和分析师来说非常重要,可以帮助他们更好地分析和预测金融市场的变化。

    annie_ffmpeg.zip

    根据各路大神的分享,汇集而成的一个适合window7-64的轻量级应用。需要使用cmd结合annie使用。

    手机Email 可发附件 带联系人列表

    发上来是来求助的:在sun和nokia的...各路大神有木有遇到过这种情况或者有什么想法的麻烦留言给点提示。不胜感激!在电脑上可以发带附件的邮件。发图片啦文本啦肯定是木有问题的~自带简单的联系人列表方便填写收件人

    课工场 布局

    简单布局分享给大家 里面其实还有一些问题 希望各路大神帮忙指点。

    前端方面问的多的面试题.md

    根据各路大神推荐自己整理的前端问的频率高的问题,如有错误或不足请大家指出

    openCV飞机大战.7z

    我写在最前面了希望各路神仙给我点c币吧我写在最前面了希望各路神仙给我点c币吧我写在最前面了希望各路...各路神仙给我点c币吧Opencv体感飞机大战的想法冒出准备过程比较复杂先是对项目所以依赖的库进行一个简单的分析...

Global site tag (gtag.js) - Google Analytics