Java 自定义Tomcat Webapp类加载器
我正在尝试为tomcat实现一个自定义类加载器。我的第一次尝试产生了一个类强制转换异常(显然,tomcat试图将我的加载程序强制转换为org.apache.catalina.loader.WebappLoader)。很好,我扩展了WebappLoader并将catalina.jar添加到我的构建路径中 现在我已经准备好部署(我想)。我得到了这个错误: 严重:Catalina.start: 生命周期异常:开始:: java.lang.NoClassDefFoundError: org/apache/catalina/loader/WebappLoader Tomcat随catalina.jar一起运行,因此我99.9%确定它已经加载到Tomcat中。我通过检查/server/lib/catalina.jar验证了这一点,它确实包含ApacheWebApploader。此外,如预期的那样,在中手动链接另一个catalina.jar会造成一大堆问题 我很困惑。任何提示都是热门的 谢谢Java 自定义Tomcat Webapp类加载器,java,tomcat,tomcat6,classloader,contextclassloader,Java,Tomcat,Tomcat6,Classloader,Contextclassloader,我正在尝试为tomcat实现一个自定义类加载器。我的第一次尝试产生了一个类强制转换异常(显然,tomcat试图将我的加载程序强制转换为org.apache.catalina.loader.WebappLoader)。很好,我扩展了WebappLoader并将catalina.jar添加到我的构建路径中 现在我已经准备好部署(我想)。我得到了这个错误: 严重:Catalina.start: 生命周期异常:开始:: java.lang.NoClassDefFoundError: org/apache
更新:有趣的是,在tomcat6上(扩展WebappLoader;在tomcat5.5上工作)同样的事情仍然会导致ClassCastException。在我看来,执行cast的类是使用与加载我的类的加载程序不同的加载程序加载的。我不知道我怎么能控制它,除非有另一个丢失的tomcat配置?对tomcat6也有什么想法吗?如果不知道您的代码和设置的细节,就无法确定,但这让我想起了在尝试定制类加载器时遇到的一个问题 情况是这样的:
@MyCustomAnnotation(implementation="my.custom.package.MyImpl")
public class MyFeatureProvider {
public MyFeature getFeature() { // return an instance of MyImpl here }
}
请注意,由于类
MyFeatureProvider
将在MyImpl
之前加载,因此类加载器将提前知道MyFeatureProvider
中的注释,因此它将能够覆盖MyImpl的默认委派模型。因为您的代码的其余部分只与MyImpl
作为MyFeature
的一个实例进行交互,所以父加载程序在看到未定义的符号时从不需要犹豫——ClassNoDefFound错误就解决了。也许我是很密集,但我认为应该是WebappClassLoader,而不是WebappLoader。不过导入看起来还可以。OMG;真不敢相信我这么做了。非常感谢。现在工作。