是否所有类的依赖项都由同一个类加载器加载?

dou*_*ugh 5 java tomcat web-applications class classloader

  • 在我的/tomcat/lib目录中,我有课程SharedClass(因此与所有网络应用程序共享).
  • 在我的网络应用程序中,WEB-INF/lib我上课了LocalClass.
  • SharedClass有参考LocalClass.

在我的网络应用程序中,我尝试创建一个实例SharedClass但它失败并显示以下消息:

NoClassDefFoundError:LocalClass.

由于SharedClass是共享的并且LocalClass是我的网络应用程序的本地,我希望它可以工作,但事实并非如此.

我怀疑是SharedClass由Tomcat父类加载器LocalClass加载并由Web App类加载器加载.由于SharedClass父进程加载,我假设所有依赖项也必须由父进程加载.因此,父级无法找到LocalClass并抛出错误.

这有意义吗?有没有办法解决这个问题(没有编写我自己的类加载器)?

JB *_*zet 7

ClassLoaders是分层的.类加载器具有父级,并查看其父级的类.反之则不然.因此,由webapp的类加载器加载的类可以访问由公共Tomcat类加载器(其父级)加载的类,该类可以访问JRE类(Tomcat的类加载器的父级).

有关更多详细信息,请参阅Tomcat文档ClassLoader javadoc.