尝试在Tomcat 7中使用org.apache.catalina.loader.VirtualWebappLoader时出现java.lang.ClassCastException

时间:2013-08-04 11:11:55

标签: tomcat classcastexception

我正在尝试使用Tomcat7和几个相关的webapp和Java项目构建开发环境。

根据建议(http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Virtual_webapp),我配置了以下上下文:

<Context path="/vcaui" docBase="/Users/alexey/EclipseWorkspaces/dooks/application/VCAUI/war" reloadable="true">                    
<Loader loaderClass="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="/Users/alexey/EclipseWorkspaces/dooks/application/VCA/bin" />
<JarScanner scanAllDirectories="true" />
</Context>

我收到以下错误,尝试启动Tomcat:

Aug 04, 2013 1:41:56 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Context/Loader} Setting property 'virtualClasspath' to '/Users/alexey/EclipseWorkspaces/dooks/application/VCA/bin' did not find a matching property.
Aug 04, 2013 1:41:56 PM org.apache.catalina.loader.WebappLoader startInternal
SEVERE: LifecycleException 
java.lang.ClassCastException: org.apache.catalina.loader.VirtualWebappLoader cannot be cast to  org.apache.catalina.loader.WebappClassLoader
at org.apache.catalina.loader.WebappLoader.createClassLoader(WebappLoader.java:731)
at org.apache.catalina.loader.WebappLoader.startInternal(WebappLoader.java:583)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5299)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:656)
at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1635)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)

有没有人有线索?

2 个答案:

答案 0 :(得分:1)

尝试将loaderClass替换为className。我过去曾经使用它,并从这个bit from the tomcat documentation

中取得了示例

(复制示例,以防将来页面消失)

<Context path="/mywebapp" docBase="/Users/theuser/mywebapp/src/main/webapp" >
  <Resources className="org.apache.naming.resources.VirtualDirContext" 
             extraResourcePaths="/WEB-INF/classes=/Users/theuser/mywebapp/target/classes" />
  <Loader className="org.apache.catalina.loader.VirtualWebappLoader"
          virtualClasspath="/Users/theuser/mywebapp/target/classes; /Users/theuser/.m2/repository/log4j/log4j/1.2.15/log4j-1.2.15.jar" />
  <JarScanner scanAllDirectories="true" />
</Context>

答案 1 :(得分:0)

加载程序标签可以替换为资源和预资源。这些标签的详细信息为here

例如:

<Resources className="org.apache.catalina.webresources.StandardRoot">
    <PreResources className="org.apache.catalina.webresources.DirResourceSet"
        base="${catalina.base}/{YOUR_DIRECTORY}"
        internalPath="/"
        webAppMount="/WEB-INF/classes"/>
</Resources>