当存在 2 个版本的库时按需在 tomcat 中加载类?

Posted

技术标签:

【中文标题】当存在 2 个版本的库时按需在 tomcat 中加载类?【英文标题】:class loading in tomcat on demand when 2 versions of a lib are present? 【发布时间】:2018-07-02 13:12:18 【问题描述】:

我从互联网上搜索了很多资源。但我仍然找不到能准确解决我的问题的特定资源。

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

我在 webapps 中有 myApp.war 文件。在那场战争中,我有一些库(比如 mylib-2.5.jar 捆绑在其中)。想象一下,我还在 /lib 文件夹中放置了不同版本的同一个库(比如 mylib-2.8.jar)。

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

lib 冲突的可能性有多大?原因是什么?

【问题讨论】:

tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html 有什么问题? @GyroGearless 它没有关于冲突的答案。可能是我的问题标题是错误的。 :)) @GyroGearless 问题已编辑。 :)) Order of loading jar files from lib directory的可能重复 【参考方案1】:

来自@GyroGearless 发布的链接

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

•JVM 的引导类

•/WEB-INF/Web 应用程序的类

•/WEB-INF/lib/*.jar 您的 Web 应用程序

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

•通用类加载器类(如上所述)

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

•JVM 的引导类

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

•通用类加载器类(如上所述)

•/WEB-INF/Web 应用程序的类

•/WEB-INF/lib/*.jar 您的 Web 应用程序

如果类加载器需要加载类 X,那么一旦它在一个地方找到它,它就不会在任何其他地方寻找它。 如果您将一个版本的依赖项(例如 mysql 驱动程序)放置到 $JAVA_HOME/jre/lib/ext 并将另一个版本放入 /WEB-INF/lib,则可能会发生 Lib 冲突

【讨论】:

/lib 中的 jar 会发生什么变化?? @SupunWijerathne 类由 common 类加载器 (tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html) 加载

以上是关于当存在 2 个版本的库时按需在 tomcat 中加载类?的主要内容,如果未能解决你的问题,请参考以下文章

C#+FastReport 如何按需在报表中显示设置图片内容(图文)

C#+FastReport 如何按需在报表中显示设置图片内容(图文)

在一个Python脚本中加载2种不同版本的库

在一个Python脚本中加载2种不同版本的库

在运行时按需更改组件类

在运行时按需创建模式和表