有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否可能在公共/共享上下文中使用Spring库?

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

如果spring库相对于spring可能间接使用或可能使用spring的其他库被移动到公共上下文中,它会起作用吗?像hibernate一样,因为应用程序使用spring tx等。hibernate是否也必须移动到公共/共享上下文

你认为呢,还有哪些方面?从spring应用程序上下文的角度来看,这样会容易得多


共 (3) 个答案

  1. # 1 楼答案

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

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

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

  2. # 2 楼答案

    @RichW说将Spring库放在Tomcat的公共类加载器中是错误的做法,这是正确的。很有可能它不会起作用

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

    需要注意的是,在这个过程中,类永远不会从子类加载器加载。因此,Spring所需的任何类也需要加载到公共类加载器中——包括asm、log4j、commons日志和cglib(所有这些都是Spring所依赖的)。这将导致一系列问题:特别是,包括公共类路径isa whole world of hurt中的公共日志记录

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

    安全地做到这一点的唯一方法是考虑使用完整的应用服务器(如JBaseAS),并将应用程序部署为EAR。p>

  3. # 3 楼答案

    如果您能够从Tomcat移动到一个完整的JavaEE容器,那么一个选项就是使用Bundled Optional Classes mechanism将所有内容打包为一个EAR

    然后你会把普通的罐子移出战争&;进入耳朵的顶部