存在2个版本的lib时,按需在Tomcat中加载类?

时间:2018-07-02 13:12:19

标签: java tomcat jvm classloader lib

我正在从互联网上搜索许多相关信息。但是我仍然找不到能确切解决我问题的特定资源。

在tomcat中,是否在启动时加载了类中的任何顺序。试想一下这样的情况。

我在webapp中有 myApp.war 文件。在那场战争中,我有一些图书馆(例如 mylib-2.5.jar捆绑在其中)。想象一下,我还在 / lib 文件夹内放置了相同版本的库(例如 mylib-2.8.jar )。

因此,当我启动应用程序并调用特定的端点时,哪个lib(版本)将有机会由类加载器加载(按需)到JVM中?

lib冲突的机会是什么?那是什么原因?

1 个答案:

答案 0 :(得分:3)

来自@GyroGearless发布的链接

  

因此,从Web应用程序的角度来看,类或资源的加载按以下顺序显示在以下存储库中:

     

•JVM的引导类

     

•/ WEB-INF /您的网络应用程序类

     Web应用程序的

•/ WEB-INF / lib / *。jar

     

•系统类加载器类(如上所述)

     

•公共类加载器类(如上所述)

     

如果将Web应用程序类加载器配置为<Loader delegate="true"/>,则顺序变为:

     

•JVM的引导类

     

•系统类加载器类(如上所述)

     

•公共类加载器类(如上所述)

     

•/ WEB-INF /您的网络应用程序类

     Web应用程序的

•/ WEB-INF / lib / *。jar

如果类加载器需要加载类X,则一旦它在一个位置找到它,就不会在其他任何位置查找它。 如果将依赖关系的一个版本(例如MySQL驱动程序)放置到$JAVA_HOME/jre/lib/ext并将另一个版本放置到/WEB-INF/lib

,则库冲突可能发生