【问题标题】:What are the downsides of setting class loading order to prefer app classes in a Java EE app在 Java EE 应用程序中设置类加载顺序以首选应用程序类有什么缺点
【发布时间】:2013-01-16 10:00:08
【问题描述】:

在我的 WebSphere 8 应用服务器上,默认的类加载顺序是 parent_first(尝试从应用服务器类加载器加载,然后才从 EAR 类加载器加载)。
这会在我的应用程序对 Apache 的 HttpClient 的使用和 WebSphere 的内部使用之间产生冲突。
我正在考虑将加载顺序切换到 parent_lastprefer-web-inf-classes 在 WebLogic 中)。

将 Java EE 应用程序类加载顺序翻转到 parent_last 时需要注意哪些陷阱?

【问题讨论】:

    标签: jakarta-ee classloader nosuchmethoderror websphere-8


    【解决方案1】:

    应该没有。

    PARENT_LAST 允许您的应用程序与类和 jar 一起分发,否则这些类和 jar 会与 WebSphere 的冲突。当两个不同的不兼容类加载器加载 WebSphere AS 和您的应用程序中的类时,只要出现 ClassClassException,就会使用该设置。

    类加载器模式 - PARENT_FIRSTPARENT_LAST - 在 Class loaders in the WebSphere Application Server 8.0 Information Center 中进行了描述。

    人们倾向于将 jar 包捆绑在应用程序中,这会使部署时间更长、内存消耗更高并且(库)管理更难。

    对于开发人员来说,将所有内容保存在应用程序中显然更容易,因此他们不必描述管理员必须设置的共享库(或 OSGi 存储库)。

    我想不出PARENT_LAST 有帮助的情况,除非我们假设在应用程序中分发 jar 是一件好事(我会争论这一点)。

    应用程序中的 jar 越少越好:

    1. 当通过共享库或 OSGi 存储库修复问题时,应用程序可以从升级其 jar 中受益,这将简化其维护
    2. 应用程序可以共享库,从而降低内存期望并提高可重用性(显然部署变得更快)

    可能有更多的理由不在应用程序中捆绑 jar,这会进一步削弱 PARENT_LAST 配置设置。

    坚持PARENT_FIRST,直到他们告诉你他们有理由更换,当它发生时你告诉他们答案;-)

    【讨论】:

    • 谢谢 Jacek,虽然我不同意。当您的堆以 GB 为单位时,IMO 类加载所需的堆空间并不重要。最近的历史表明,我们认为您最好准确地打包您需要的东西,否则您将遇到 API 损坏 (DDL HELL),或者由于您从未测试过的不受欢迎的基础组件升级而出现不良行为。
    • 这就是 OSGi 具有其精确的 Import-Package/Export-Package 版本控制方案的原因。我坚信 OSGi 的价值,尽管它可能不像许多人希望的那样对开发人员友好。众所周知的 jar 地狱是当您无法控制依赖项版本时。当您将环境所需的内容声明为一组对(名称,版本)时,您永远不应该面临不兼容的问题(除非对(名称,版本)不是“稳定的”,这意味着您依赖于非常不稳定的基础)。
    • 哦,好的。得到你。因此,OSGI 消除了 x.y.z 的导入/whatever version/ 中的歧义。对于那些愿意支付开发开销的人来说,这似乎确实很强大。谢谢!
    • 我偏向于 OSGi,所以请稍加注意——我认为没有必要“支付开发开销”。管理依赖关系非常复杂,使用 OSGi 它不会改变,但认为它可能会减轻很多。 WebSphere 支持OSGi Applications,我强烈建议研究这个概念。
    【解决方案2】:

    来自Understanding the IBM Software Developers Kit (SDK) for Java > Class loading

    [委托模型] 防止来自不太受信任的来源的代码被替换 通过假定与核心部分同名的可信核心 API 类 API。

    因此,PARENT_LAST 似乎存在于应用程序由于版本不兼容而必须覆盖基类的情况,但这样做也可能会削弱安全性。

    【讨论】:

    • 很有趣,但我无法想象这种形式的安全性在我用我信任的罐子打包我的 EAR 时会有多么重要。
    • @GiliNachum 当然,只有从托管环境的角度来看,这才有意义,即应用程序的运营商所在的环境。服务器不必信任应用程序上部署的应用程序的开发人员。服务器。你相信你的罐子;但运营商可能不信任
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多