【问题标题】:Adding ClassLoader to the Tomcat将 ClassLoader 添加到 Tomcat
【发布时间】:2013-03-02 04:36:51
【问题描述】:

我有一个包含大部分业务逻辑的 JAR 文件。我在 Spring MVC 中开发的 Web 应用程序使用该 JAR 文件。为了保护 JAR 文件,我使用了 JarCryp。 JarCryp 已从 JAR 文件创建了一个 .sjar 文件。现在,为了从 Tomcat 加载 JAR 文件,我已经添加到 Tomcat 的 context.i.e.Added 以下行到 context.xml

 <Loader className="ComponioSampleClassLoader" ></Loader>

ComponioSampleClassLoader 类扩展了 org.apache.catalina.loader.WebappClassLoader

现在,当我启动 tomcat 时,出现以下错误

INFO: Deploying configuration descriptor host-manager.xml
Mar 1, 2013 11:50:41 PM org.apache.tomcat.util.digester.Digester endElement
SEVERE: End event threw exception

    java.lang.IllegalArgumentException: argument type mismatch
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:928)
        at org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:193)
        at org.apache.tomcat.util.digester.Rule.end(Rule.java:229)
        at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1138)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1642)
        at org.apache.catalina.startup.ContextConfig.processContextConfig(ContextConfig.java:793)
        at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig.java:732)
        at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:1018)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:279)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
        at org.apache.catalina.core.StandardContext.init(StandardContext.java:5700)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4448)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675)
        at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1315)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
        at org.apache.catalina.core.StandardService.start(StandardService.java:525)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
    Mar 1, 2013 11:50:41 PM org.apache.catalina.startup.ContextConfig processContextConfig
    SEVERE: Parse error in context.xml for /host-manager
    java.lang.IllegalArgumentException: argument type mismatch
        at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2806)
        at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2832)
        at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1141)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1642)
        at org.apache.catalina.startup.ContextConfig.processContextConfig(ContextConfig.java:793)
        at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig.java:732)
        at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:1018)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:279)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
        at org.apache.catalina.core.StandardContext.init(StandardContext.java:5700)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4448)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675)
        at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1315)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
        at org.apache.catalina.core.StandardService.start(StandardService.java:525)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
    Caused by: java.lang.IllegalArgumentException: argument type mismatch
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:928)
        at org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:193)
        at org.apache.tomcat.util.digester.Rule.end(Rule.java:229)
        at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1138)
        ... 40 more

你能帮帮我吗?

【问题讨论】:

    标签: tomcat6 classloader


    【解决方案1】:

    只是在同一个问题上苦苦挣扎了几个小时......

    您需要扩展 WebappLoader (org.apache.catalina.loader.WebappLoader) 而不是 WebappClassLoader。

    您会注意到两者的构造函数是相同的,因此在进行此更改时您的构造函数很可能不需要更改。

    package tomcat7;
    
    import org.apache.catalina.loader.WebappLoader;
    
    public class Tomcat7CustomWebappLoader extends WebappLoader {
    
        public Tomcat7CustomWebappLoader() {
            super();
        }
    
        public Tomcat7CustomWebappLoader(ClassLoader parent) {
            super(parent);
        }
    }
    

    查看与 Tomcat 打包的“VirtualWebappLoader”(org.apache.catalina.loader.VirtualWebappLoader) 加载器实现时,WebappLoader 的扩展也很明显。

    很遗憾,您没有使用特定用例的经验,但 Loader 需要扩展 WebappLoader。

    页面底部附近的一个更高级的实现here

    【讨论】:

    • 感谢您的回复,即使在您提到的链接中,接受的答案也是扩展 WebappClassLoader。它解决了你的问题吗?我现在就试一试,然后得到结果。
    • 好的,那么那个链接似乎是错误的——除非那是 Tomcat6 中的命名约定。在 Tomcat7 中,我需要为我的 Loader 实现扩展 WebappLoader。在 WebappLoader 中有一个引用 WebappClassLoader 的字段(对于您的实现,您可能还需要对其进行子类化 - 不确定)
    • 刚刚拿起了一些有用的东西。您可以在 标记中同时指定 Loader 和 Classloader 子类。对于 Classloader 子类,您将需要使用问题中的“loaderClass”属性而不是“className”(后者用于 Loader 子类)。在文档中搜索属性名称here
    • :- 我也尝试了 loaderClass 属性,但没有运气。我也尝试过使用 WebappLoader,但效果不佳。
    • 那我不知道 - 抱歉。我收到“参数类型不匹配”错误,当我从正确的超类继承时,我的问题得到了解决。
    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多