Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为使用相同库的许多web应用程序处理共享库_Java_Jakarta Ee_Struts2_Glassfish_Shared Libraries - Fatal编程技术网

Java 如何为使用相同库的许多web应用程序处理共享库

Java 如何为使用相同库的许多web应用程序处理共享库,java,jakarta-ee,struts2,glassfish,shared-libraries,Java,Jakarta Ee,Struts2,Glassfish,Shared Libraries,我们有一个用Java制作的web应用程序,它使用struts2、spring和JasperReport。此应用程序在glassfish 4.0上运行 应用程序的库位于WEB-INF/lib文件夹中,glassfish中也安装了4个以上的库 Glassfish被配置为使用1024mb的heapspace和512m的permgen,当我使用每个应用程序的库时,大多数内存消耗都在struts actions和spring aop类中(使用netbeans profiler) 我们面临的问题是,每个应用

我们有一个用Java制作的web应用程序,它使用struts2、spring和JasperReport。此应用程序在glassfish 4.0上运行

应用程序的库位于WEB-INF/lib文件夹中,glassfish中也安装了4个以上的库


Glassfish被配置为使用1024mb的heapspace和512m的permgen,当我使用每个应用程序的库时,大多数内存消耗都在struts actions和spring aop类中(使用netbeans profiler)

我们面临的问题是,每个应用程序在类加载器中使用库所消耗的内存量太高,会产生永久错误,而且我们还注意到,用户越多,应用程序运行速度越慢

正因为如此,我们尝试使用共享库,将其放在domain1/lib文件夹中,发现使用单个部署的应用程序,加载时间和内存消耗要低得多,并且应用程序通常工作得更快。但是,当我们在服务器上部署其余的应用程序时,只有第一个加载的应用程序工作正常,其余的应用程序在调用struts2操作时出错。 我们认为这是因为每个应用程序在struts2和log4j上的设置略有不同

我们还尝试在glassfish上只放置某些库,并在应用程序中只保留struts2,但它显示InvocationTargetException错误,因为所有库都依赖于apache common的库,并且不管我们是否将这些库放置在某个位置。如果我们把它放在两个地方,应用程序就不会启动

  • 是否有使用共享库的特殊设置或最佳实践
  • 有没有一种方法可以使用共享库,但可以为每个应用程序加载设置?或者我们必须改变设置使它们都相同

  • 我敢打赌,将lib放在lib/或lib/ext下不会解决性能问题。您没有写任何关于应用程序或服务器设置的内容,比如应用程序的大小、可用堆和PermGen空间,但是我建议每个应用程序使用单独的lib

    如果将LIB放在服务器目录中,它们将在所有应用程序之间共享。您将失去仅将一个应用程序升级到新框架或删除其中任何一个应用程序的选项。您的部署将绑定到特定的服务器体系结构

    你写的这篇文章并没有解决你的问题,它甚至可能引发新的问题

    我建议您花几个小时来调优服务器。如果它以默认值运行,请分配更多PermGen和HeapSpace


    如果这没有帮助,你应该深入分析哪里出了问题。共享libs可能是一个解决方案,但您还不知道问题所在。IBM提供了一些非常酷的免费工具来分析堆转储,这可能是一个很好的起点。

    您可以尝试创建所谓的堆转储。将所有WAR打包到EAR中,并将所有常用JAR从
    WEB-INF/lib
    移动到EAR中的
    lib/
    文件夹中(不要忘记在
    application.xml
    中设置

    使用共享库是否有任何特殊设置或最佳做法?有没有一种方法可以使用共享库,但可以为每个应用程序加载设置?或者我们必须改变设置使它们都相同

    这些都是很有趣的问题。。。我不使用玻璃鱼,但是:

    特定于应用程序的类加载 [……] 您可以指定特定于模块或应用程序的库类[…]使用asadmin deploy命令和
    --libraries
    选项,并指定逗号分隔的路径 [……]

    规避类装入器隔离 由于每个应用程序或单独部署的模块类装入器都是隔离的,因此应用程序或模块无法从另一个应用程序或模块装入类。这可以防止不同应用程序或模块中两个名称类似的类相互干扰

    要规避由多个应用程序访问的库、实用程序类或单独部署的模块的此限制,可以通过以下方式之一包括所需类的相关路径:

    • 使用公共类装入器
    • 跨集群共享库
    • 将一个应用程序的客户端JAR打包到另一个应用程序中
    使用公共类装入器 要使用公共类加载器,请将JAR文件复制到
    domain dir/lib
    as install/lib
    目录中,或将.class文件(以及其他所需文件,如.properties文件)复制到
    domain dir/lib/classes
    目录中,然后重新启动服务器

    使用公共类加载器使部署在共享相同配置的服务器上的所有应用程序或模块都可以访问应用程序或模块。但是,这种可访问性并不扩展到应用程序客户端。有关更多信息,请参阅将库与应用程序客户端一起使用。[……]

    然后我会尝试:

    解决方案1
    • 将除Struts2 JAR之外的所有库放在
      domain1/lib
    • 仅将Struts2 jar放在
      domain1/lib/applibs
    然后跑

    $ asadmin deploy --libraries struts2-core-2.3.15.2.jar FooApp1.war
    $ asadmin deploy --libraries struts2-core-2.3.15.2.jar FooApp2.war
    
    $ asadmin deploy --libraries struts2-core-2.3.15.2_FooApp1.jar FooApp1.war
    $ asadmin deploy --libraries struts2-core-2.3.15.2_FooApp2.jar FooApp2.war
    
    隔离Struts2库类加载,同时将其余库保持在Common Classloader的控制下

    解决方案2
    • 将除Struts2 JAR之外的所有库放在
      domain1/lib
    • 仅将Struts2 jar放在
      domain1/lib/applibs
      下,放在不同名称的不同副本中,例如在jar名称后面附加_appname
    然后跑

    $ asadmin deploy --libraries struts2-core-2.3.15.2.jar FooApp1.war
    $ asadmin deploy --libraries struts2-core-2.3.15.2.jar FooApp2.war
    
    $ asadmin deploy --libraries struts2-core-2.3.15.2_FooApp1.jar FooApp1.war
    $ asadmin deploy --libraries struts2-core-2.3.15.2_FooApp2.jar FooApp2.war
    
    通过显示(模拟)库的不同版本来防止库的共享


    希望这能有所帮助,让我知道上面的一些方法是否有效。

    我来这里是为了寻求有关安装多个应用程序或项目共享的库的指导。我