Websphere讨厌多版本的jar

时间:2018-03-02 10:14:41

标签: java websphere

此问题与Jetty中的类似问题重复,但我找不到有关Websphere的文献

我有一个运行在Java 7上的Websphere 8.5.5.7。直到今天我们才发现将log4j从2.7升级到2.10会破坏启动。以下是众多堆栈跟踪之一:

[01/03/18 10.12.14:154 CET] 000003d9 ecs           W com.ibm.ws.ecs.internal.scan.context.impl.ScannerContextImpl scanJAR unable to open input stream for resource module-info.class in archive WEB-INF/lib/log4j-api-2.10.0.jar
                                 java.lang.IllegalArgumentException
    at org.objectweb.asm.ClassReader.<init>(Unknown Source)
    at org.objectweb.asm.ClassReader.<init>(Unknown Source)
    at org.objectweb.asm.ClassReader.<init>(Unknown Source)
    at com.ibm.ws.ecs.internal.scan.impl.ClassScanner.scanInputStream(ClassScanner.java:147)
    at com.ibm.ws.ecs.internal.scan.impl.ClassScanner.scanInputStream(ClassScanner.java:124)
    at com.ibm.ws.ecs.internal.scan.impl.ClassScanner.scanInputStream(ClassScanner.java:120)
    at com.ibm.ws.ecs.internal.scan.context.impl.ScannerContextImpl.scanJAR(ScannerContextImpl.java:275)
    at com.ibm.ws.ecs.internal.scan.context.impl.ScannerContextImpl.scanJARs(ScannerContextImpl.java:315)
    at com.ibm.ws.ecs.internal.scan.context.impl.WARScannerContext.scanInternal(WARScannerContext.java:76)
    at com.ibm.ws.ecs.internal.scan.context.impl.ScannerContextImpl.scan(ScannerContextImpl.java:87)
    at com.ibm.ws.ecs.internal.scan.context.impl.ScannerContextImpl.getScannedClasses(ScannerContextImpl.java:70)
    at com.ibm.ws.webcontainer.webapp.WebAppImpl.scanForHandlesTypesClasses(WebAppImpl.java:760)
    at com.ibm.ws.webcontainer.webapp.WebAppImpl.initializeServletContainerInitializers(WebAppImpl.java:601)
    at com.ibm.ws.webcontainer.webapp.WebAppImpl.initialize(WebAppImpl.java:406)

基本上,log4j开发人员对于使用Java 9的多版本jar来适应较旧的Java运行时具有很好的(但不吉利的)想法。

我们的安装无法升级。这些是版本,我们必须保留它们。我曾尝试使用websphere谷歌周围的多发布罐子,但似乎没有文献。

我想问是否有任何配置解决方法,至少在目标版本的websphere中的选定软件包中禁用大量扫描jar。

1 个答案:

答案 0 :(得分:1)

现有APAR。见APAR PI89708

如果这不能解决问题,您应该打开PMR,以便IBM可以修复它。

WebSphere Application Server传统确实提供了一种减少JAR文件扫描量的机制。但是,这可能(或可能不是)解决此问题的方法,因为并非WAS的所有组件都遵循注释扫描过滤器。虽然仍然值得关注,因为减少扫描活动可以缩短部署时间。

查看 WAS_HOME / properties下的amm.filter.properties文件。 将您不想扫描的JAR文件的名称添加到&#34; Ignore-Scanning-Archives&#34;属性。有更多选项可用于指定要从扫描中过滤的JAR。您可以找到更多信息here

另请注意,WAS 8.5.5在多版本JAR存在之前发布。因此,必须在服务中添加支持或更准确的容差。我说容忍,因为目前不支持Java 9。目前,WAS只需要容忍META-INF目录下的类的存在。

如果绝对无法升级或修补应用程序服务器,那么最简单的选择是修改log4J JAR文件,删除META-INF目录下的类。我知道这也不可取,因为你不应该修改第三方JAR,但我怀疑过滤器在这种情况下是否有效。因此,如果不修补应用程序服务器,它可能是唯一的选择。

正如您在评论中指出的那样,在这种特殊情况下,由于LOG4J没有JAVA EE注释,因此可以忽略警告消息。应用程序应该启动并正常运行。但是,如果JAR包含Java EE注释,那么这些注释将不会被处理。如果是这种情况,我希望应用程序启动,但它可能无法正常运行。

  
    
      

&GT;       自这个问题的原始答案以来,增加了额外的APAR。以下是APAR的完整列表:       PI89708PI93744PI96826PH02014PH03710