Web applications Websphere类加载

Web applications Websphere类加载,web-applications,jvm,websphere,classloader,Web Applications,Jvm,Websphere,Classloader,我们在WebSphereApplicationServer7中部署了一个应用程序。它可以在各种环境中部署和运行。但它在一个新环境中给出了一个未找到的方法异常。深入挖掘后,我们发现一个特定的类存在于2个jar中,来自“错误”jar的类被加载到新的env中。我浏览了详细的类装入器视图,其中jar的装入顺序不同 在进一步的调查中,jar文件在每个env中的加载顺序似乎存在随机差异 2个问题: 1) WAS类加载策略依赖于哪个因素&有什么建议可以纠正这个问题吗 2) 更一般地说,当我们在任何java程序

我们在WebSphereApplicationServer7中部署了一个应用程序。它可以在各种环境中部署和运行。但它在一个新环境中给出了一个未找到的方法异常。深入挖掘后,我们发现一个特定的类存在于2个jar中,来自“错误”jar的类被加载到新的env中。我浏览了详细的类装入器视图,其中jar的装入顺序不同

在进一步的调查中,jar文件在每个env中的加载顺序似乎存在随机差异

2个问题:

1) WAS类加载策略依赖于哪个因素&有什么建议可以纠正这个问题吗


2) 更一般地说,当我们在任何java程序的类路径中指定pseuteng*.jar时,任何JVM如何加载jar?例如,它是按字母顺序排列的,还是按修改的时间或任何此类文件属性排列的?

在WAS下安装web应用程序时,您可以在该应用程序的选项中设置类加载策略(或在服务器/节点级别全局设置)


如果策略选项为(搜索)“父级优先”/“父级最后”和每个应用程序或每个war一个类加载器。默认值为“父级优先/战争”。如果您的web应用程序附带了它所需的所有JAR,那么您最好将策略设置为“parent last/application”。另外,如果您编辑web.xml以反映更改,请确保设置“使用二进制配置”,否则它将始终使用安装期间存储的内容。

Java将按照类路径中指定的顺序加载类。因此,如果您的类路径是“c:\jar1.jar;c:\jar2.jar”,并且jar1.jar和jar2.jar包含相同的类,那么将始终使用jar1.jar中的类。如果顺序颠倒,那么将始终使用jar2.jar类

维基百科解释了类加载器是如何工作的

可以通过服务器上的WAS管理控制台在服务器>进程定义>Java虚拟机下配置类路径


它也可以根据应用程序进行配置。

您提出的问题非常大。要解决您的问题,有两种选择:

  • 最后选择PARENT,并将所需的JAR版本添加到类路径中
  • 先和家长呆在一起,但要降级应用程序附带的JAR,以匹配所提供的内容

  • 我已经完成了这些步骤。混淆的点是不同的。假设我的web应用程序库文件夹包含4个jar,如a.jar、b.jar、c.jar、d.jar,这4个jar的加载顺序是什么?希望我能说清楚。相对于服务器和应用程序而言,它不依赖于JAR的加载。而是应用程序JAR加载的相对顺序。如果需要特定的顺序,可以使用MANIFEST classpath设置(我从来没有这样做过,但有人提到过)。在
    WEB-INF/lib
    中的JAR之前搜索
    WEB-INF/classes
    ,以便您可以将所需的类提取到该位置。一种解决方法(针对不需要的情况)是在将攻击性类打包到
    .war
    Hmm中之前从
    .jar
    中删除攻击性类。这两种方法看起来都有点难看,但公平地说,这是一个难看的问题。我试过第二种选择。它给出了更多的问题…基本上是因为运行时的类环境混乱。知道这个jar的加载依赖于什么因素吗?当没有设置类路径时,/lib中的搜索顺序是未定义的(据我所知)。因此,了解如何在清单文件中定义web应用程序类路径是最好的选择。如果您能够将要首先加载的
    .jar
    放在文件系统上,则可以通过管理控制台定义一个共享库,并将其添加到web应用程序的类路径中。在WAS6.1中,管理控制台包含一个类加载器资源管理器,它可以提供解决方案的细节。混淆的点是不同的。假设我的web应用程序库文件夹包含4个jar,如a.jar、b.jar、c.jar、d.jar,这4个jar的加载顺序是什么?希望我能说清楚。相对于服务器和应用程序而言,它不依赖于JAR的加载。您可以通过添加MANIFEST.MF文件并在其中指定Class Path属性来指定WAR的加载顺序,而不是应用程序jars.Gotcha的相对顺序。更多信息请点击此处: