【问题标题】:Would it be possible having Spring libraries in common/shared context?是否有可能在公共/共享上下文中拥有 Spring 库?
【发布时间】:2023-03-07 16:17:01
【问题描述】:

我们有一个门户应用程序,其中包含一个主要 Web 应用程序上下文和许多次要 Web 应用程序上下文 - 插件。目前(非常简化)Main 有自己的 spring 库,如果他们想使用 spring,插件也必须拥有它们。在公共/共享的 tomcat 上下文中,只有驱动程序和接口。

如果将 spring 库移动到关于 spring 可能间接使用或它们可能使用 spring 的其他库的公共上下文中,它会起作用吗?像休眠一样,因为应用程序正在使用 spring-tx 等。休眠也必须移动到公共/共享上下文吗?

你怎么看,其他方面是什么?从 Spring 应用程序上下文的角度来看,这样会容易得多。

【问题讨论】:

    标签: java spring classloader servlet-container


    【解决方案1】:

    @RichW 正确地指出将 Spring 库放在 Tomcat 的公共类加载器中是不好的做法。而且很有可能它不起作用。

    Java 使用classloader hierarchy)。当请求类加载时,类加载器将在尝试使用它自己的类路径加载类之前递归地从它的父类加载器请求类。这个过程一直持续到根类加载器(称为引导类加载器)。通过这种方式,从父类加载器引用的类总是优先于在层次结构更下层的类加载器中引用的类。

    请务必注意,在此过程中,类永远不会从子类加载器中加载。因此,Spring 所需的任何类也需要加载到公共类加载器中——包括 asm、log4j、commons-logging 和 cglib(所有这些都是 spring 依赖的)。这将导致一大堆问题:特别是,在公共类路径中包含 commons-logging 是 a whole world of hurt

    如果您确实设法启动了 Tomcat,那么在回收应用程序时您会遇到内存泄漏问题。在 tomcat 中,应用程序是使用传统的垃圾收集卸载的,因此如果有任何东西对应用程序中的类的引用,该类随后被重新启动,则该应用程序将不会获得垃圾收集。 Spring 和日志框架是保存类引用的主要候选者,因此在几次应用程序重新启动后,您可能会遇到 OOM 错误。

    安全地执行此操作的唯一方法是考虑使用成熟的应用服务器(例如 JBoss AS)并将您的应用程序部署为 EAR。

    【讨论】:

      【解决方案2】:

      如果您能够从 Tomcat 迁移到成熟的 Java EE 容器,那么您可以选择使用 Bundled Optional Classes mechanism 将所有内容打包为 EAR

      然后,您将公共 JAR 从 WAR 中移出并移到 EAR 的顶层。

      【讨论】:

        【解决方案3】:

        是的,我知道这很诱人。是的,它可以工作。但是,将特定于应用程序或特定于框架的库放在应用服务器的共享库文件夹中被一些人认为是一种不好的做法,我同意。

        在我看来,web-apps 应该包含它们自己的依赖项(app jars、framework jars 等)。框架也有依赖关系,通常需要多个具有特定版本的 jar。有时这些版本会更改,有时依赖项会更改。随着时间的推移,共享库文件夹将成为 jar 的厨房水槽,这将影响您的所有应用程序,可能会以不可预知的方式。

        使用共享库文件夹路线,您会获得一些最初的便利,但您会失去选择:一次只影响一个网络应用程序的选择。我建议你将你的 jars 保存在你的网络应用程序中,很好地包含并与其他网络应用程序分开。这将使它们更可靠,并且您会发现框架升级更容易处理。我向你保证,从长远来看,你会更快乐。

        【讨论】:

        • 您的回答是关于是否在公共/共享上下文中拥有库的完全笼统的......我不是在这里泛泛而谈。我特别提到了 Spring 框架。它没有第三方依赖,如果几乎每个插件都必须加载自己的 Spring,它会产生如此巨大的内存占用,以至于处理版本冲突就不会那么邪恶了。门户由这些插件组成。如果我称它为插件,我希望它是自我解释的......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-19
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        相关资源
        最近更新 更多