当存在 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 冲突
【讨论】:
common
类加载器 (tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html) 加载以上是关于当存在 2 个版本的库时按需在 tomcat 中加载类?的主要内容,如果未能解决你的问题,请参考以下文章
C#+FastReport 如何按需在报表中显示设置图片内容(图文)