0

我在 WEB-INF/classes 文件夹下的 war 文件中定义了一个接口。这个想法是在不干扰war文件的情况下将实现放置在类路径中。我认为的解决方案是将实现放在 tomcat_home/lib 目录中,但由于可能对实现和接口使用不同的类加载器,接口没有得到解析并且 ClassNotFound 被抛出。这个场景有可能实现吗?

4

2 回答 2

0

1) 加载的公共类加载器CATALINA_HOME/lib不知道单个 webapp 中的类。

2) 负责加载 webapp 类的 webapp 类加载器不知道CATALINA_HOME/lib. 如果它不能加载一个类,它会向上委托链。

解决方案是都必须使用相同的类加载器加载。您必须保留这两个类,CATALINA_HOME/lib以便通用类加载器可以解析它们。

于 2013-07-19T10:29:11.277 回答
0

您收到此错误是因为您的实现在接口之前加载到内存中,因为 Application Server 运行时中的类加载器遵循委托层次结构,其中 tomcat lib 中的类在 web-inf/classes 中的类之前加载。因此,如果您想删除错误,请将两者都保存在 tomcat lib 中,以便两者同时加载。

在此处输入图像描述

在委托设计中,类加载器在尝试加载类本身之前将类加载委托给其父级。类加载器父级可以是系统类加载器或另一个自定义类加载器。如果父类加载器无法加载某个类,则类加载器会尝试加载该类本身。实际上,类加载器只负责加载父级不可用的类。由层次较高的类加载器加载的类不能引用层次较低的可用类。

于 2013-07-19T10:30:47.093 回答