【问题标题】:What will happen if [WEB-INF/lib] and [tomcat/lib] contain similar JARs?如果 [WEB-INF/lib] 和 [tomcat/lib] 包含类似的 JAR,会发生什么?
【发布时间】:2018-01-02 04:27:32
【问题描述】:

今天在采访中被问到,如果Tomcat的lib和你的war文件的WEB-INF/lib包含相同的jar文件,部署时会发生什么?

我今天在我的机器上进行了测试,我没有发现任何差异。应用部署成功。

我已经完成了这个similar article,如果有人知道如果Tomcat的libWEB-INF/lib包含相同的jar会发生什么会发生什么?

【问题讨论】:

标签: java jakarta-ee jar war tomcat8


【解决方案1】:

取决于delegate 属性

我还没有尝试过这些。但它似乎取决于布尔值 delegate 属性。

而我阅读https://tomcat.apache.org/tomcat-10.0-doc/class-loader-howto.html#Class_Loader_Definitions的方式是这样的:

对于任何 webapp,都有四个类加载器:bootstrap、system、common、webapp。

  • 默认情况下,布尔值delegate 属性未指定,默认为false
    • => 类加载器的顺序:bootstrapwebappsystemcommon
    • => 你的 webapp 的 JAR 获胜。
  • 当且仅当您明确指定<Loader delegate="true"/>
    • => 类加载器的顺序:bootstrapsystemcommonwebapp
    • => common 从 $CATALINA_BASE 和 $CATALINA_HOME 获取 JAR
    • => Tomcat 的 JAR 获胜。

进一步阅读

添加信息:这是“委托”属性本身的文档。

我觉得这有点令人困惑,但似乎 Tomcat 的默认设置是不遵循 Java 的默认设置。 (不确定 Java 的默认 “委托模型” 是在哪里定义的。)

引用https://tomcat.apache.org/tomcat-10.0-doc/config/loader.html#Common_Attributes (为了强调而改变了格式。)

  • 如果您希望类加载器遵循标准的 Java2 委托模型,请设置为 true,并尝试从父类加载类 加载程序,然后再查看 Web 应用程序。

  • 设置为 false(默认值)让类加载器先查看 Web 应用程序内部,然后再要求父类加载器查找 请求的课程或资源。

【讨论】:

  • 备注:systemcommon之间有一个可选的shared类加载器。
  • @PiotrP.Karwasz。伟大的。然后就更复杂了。 :) 虽然对于这个特定的问题,它不会改变结果。
【解决方案2】:

您的WEB-INF/lib 中包含的jar 将被tomcat 拾取。唯一需要注意的是,核心容器 jar 将优先于 WEB-INF/lib 中的 jar 加载。

阅读:https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html#Class_Loader_Definitions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 2010-11-29
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多