怎样在Tomcat配置自己的Classloader

侠雨飞飞 2007-12-21 09:59:34
我查了下官方的说明,倒是很简单
可是按其说明配置后,系统总是报错

我的myapp.xml配置如下:

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="Chat" path="/Chat" reloadable="true" workDir="work\Catalina\localhost\Chat">
<Loader className="ht.util.MyClassLoader" reloadable="true" delegate="false"/>
</Context>

启动后报错:
java.lang.IllegalArgumentException: argument type mismatch
at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.
java:2726)
at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.
java:2752)
at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:106
1)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endEleme
nt(AbstractSAXParser.java:633)
at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.
emptyElement(AbstractXMLDocumentParser.java:221)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l.scanStartElement(XMLDocumentFragmentScannerImpl.java:872)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1693)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImp
l.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(X
ML11Configuration.java:834)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(X
ML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.
java:148)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Ab
stractSAXParser.java:1242)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562)
at org.apache.catalina.startup.ContextConfig.processContextConfig(Contex
tConfig.java:782)
at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig
.java:722)
at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:987
)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfi
g.java:279)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(Lifecycl
eSupport.java:120)
at org.apache.catalina.core.StandardContext.init(StandardContext.java:50
71)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:3
984)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase
.java:760)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:74
0)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)

at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.ja
va:626)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.j
ava:553)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488
)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java
:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(Lifecycl
eSupport.java:120)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022)

at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)

at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443
)
at org.apache.catalina.core.StandardService.start(StandardService.java:4
48)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700
)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2007-12-21 9:57:43 org.apache.catalina.startup.ContextConfig processContextConfi
g
严重: Occurred at line 4 column 52
2007-12-21 9:57:43 org.apache.catalina.startup.ContextConfig start
严重: Marking this application unavailable due to previous error(s)
2007-12-21 9:57:43 org.apache.catalina.core.StandardContext start
严重: Error getConfigured
2007-12-21 9:57:43 org.apache.catalina.core.StandardContext start
严重: Context [/chat] startup failed due to previous errors
2007-12-21 9:57:46 org.apache.coyote.http11.Http11BaseProtocol start
信息: Starting Coyote HTTP/1.1 on http-8088
2007-12-21 9:57:56 org.apache.jk.common.ChannelSocket init
...全文
562 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
libos88 2010-09-17
  • 打赏
  • 举报
回复
我也在做这个 lz 做好要发出来 教教我啊 谢谢
帮顶 up
J2eeFans 2008-01-30
  • 打赏
  • 举报
回复
来晚了,1楼正解
侠雨飞飞 2008-01-29
  • 打赏
  • 举报
回复
因为我想加密JAVA源码来着,将java class文件加密后,用自己的classloader来加载。
现在手工加载测试是没有问题,就是配置不上去,呵呵。
看来无人知道了,今晚结贴。
cchaha 2007-12-27
  • 打赏
  • 举报
回复
进来学习,帮楼主顶上去
nanjg 2007-12-26
  • 打赏
  • 举报
回复
不是没有必要去classload!
而是要深入的了解classload再去自己加载类吧

它的原理大致是这样:

1 调用 findLoadedClass 来查看是否存在已装入的类。
2 如果没有,那么采用那种特殊的神奇方式来获取原始字节。
3 如果已有原始字节,调用defineClass将它们转换成Class对象。
4 如果没有原始字节,然后调用findSystemClass查看是否从本地文件系统获取类。
5 如果resolve参数是true,那么调用resolveClass解析Class对象。
6 如果还没有类,返回ClassNotFoundException。
7 否则,将类返回给调用程序。

配置小意思 建议先花时间去理解classload的原理
YeLang2007 2007-12-21
  • 打赏
  • 举报
回复
嗯,同意楼上的看法.一般不要做这样的热部署,有可能会带来很多不便的.

我也是觉得你的Loader类型是不对的,参照楼上说的再试试吧!!

祝你好运哦...
ChDw 2007-12-21
  • 打赏
  • 举报
回复
你必须使用自定义的ClassLoader吗?一般没有必要

如果要,你的配置也是错误的,Loader段要求的不是ClassLoader,而是org.apache.catalina.Loader

你可以下载Tomcat的代码,找到WebappLoader看看里面的实现,其中有getClassLoader方法

在这个方法中你再返回自已的ClassLoader

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧