`
ihuashao
  • 浏览: 4546823 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

关于WAS当中FFDC报告error in opening zip file剖析及解决

阅读更多

http://yulimin.iteye.com/blog/299956

关于WAS当中FFDC报告java.util.zip.ZipException: error in opening zip file剖析及解决

问题:
WAS下FFDC日志目录中出现如下的错误,打开zip文件错误

Java代码 复制代码
  1. FFDCException:java.util.zip.ZipExceptionSourceId:com.ibm.ws.classloader.ClassLoaderUtils.addDependentsProbeId:238Reporter:java.lang.Class@7c537c91
  2. java.util.zip.ZipException:errorinopeningzipfile
  3. atjava.util.zip.ZipFile.open(NativeMethod)
  4. atjava.util.zip.ZipFile.<init>(ZipFile.java:114)
  5. atjava.util.jar.JarFile.<init>(JarFile.java:133)
  6. atjava.util.jar.JarFile.<init>(JarFile.java:70)
  7. atcom.ibm.ws.classloader.ClassLoaderUtils.addDependents(ClassLoaderUtils.java:96)
  8. atcom.ibm.ws.classloader.ClassLoaderUtils.addDependents(ClassLoaderUtils.java:143)
  9. atcom.ibm.ws.classloader.ClassLoaderUtils.addDependentJars(ClassLoaderUtils.java:61)
  10. atcom.ibm.ws.classloader.ClassGraph.<init>(ClassGraph.java:115)
  11. atcom.ibm.ws.classloader.ClassLoaderManager.initialize(ClassLoaderManager.java:202)
  12. atcom.ibm.ws.classloader.ClassLoaderManager.<init>(ClassLoaderManager.java:166)
  13. atcom.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:891)
  14. atcom.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:740)
  15. atcom.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2092)
  16. atcom.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:437)
  17. atcom.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:122)
  18. atcom.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:380)
  19. atcom.ibm.ws.runtime.component.CompositionUnitMgrImpl.access$300(CompositionUnitMgrImpl.java:105)
  20. atcom.ibm.ws.runtime.component.CompositionUnitMgrImpl$CUInitializer.run(CompositionUnitMgrImpl.java:928)
  21. atcom.ibm.wsspi.runtime.component.WsComponentImpl$_AsynchInitializer.run(WsComponentImpl.java:349)
  22. atcom.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1527)


那到底是哪个文件在打开时发生错误了呢?一头雾水了吧,汗。。。估计你会。。。

分析:
1、通过对文件的排查,确认排除了应用程序中引用jar文件损坏的可能性以及由于jar文件权限设置导致无法读取的可能性

2、打开跟踪日志级别进行剖析

Java代码 复制代码
  1. Applicationservers>memXXX>LoggingandTracing>Changelogdetaillevels


设置ClassLoaderUtils跟踪级别如下

Java代码 复制代码
  1. *=info:com.ibm.ws.classloader.ClassLoaderUtils=finest


重新启动后,在trace.log里可以发现如下信息

Java代码 复制代码
  1. 0000001eClassLoaderUt>addDependentsEntry
  2. /home/xxx/lib/struts/commons-logging.jar
  3. 0000001eClassLoaderUt3dependentclasspathdetected:log4j.jarlog4j-core.jar
  4. 0000001eClassLoaderUt3adding/home/xxx/lib/struts/log4j.jar
  5. 0000001eClassLoaderUt>addDependentsEntry
  6. /home/xxx/lib/struts/log4j.jar
  7. 0000001eFfdcProviderIcom.ibm.ws.ffdc.impl.FfdcProviderlogIncidentFFDC1003I:FFDCIncidentemittedon/usr/IBM/WebSphere/AppServer/profiles/XXX/logs/ffdc/memXXX_f3c3750_08.12.23_16.26.42.85048008.txtcom.ibm.ws.classloader.ClassLoaderUtils.addDependents238
  8. 0000001eClassLoaderUt3WARNING:couldnotopen/home/xxx/lib/struts/log4j.jar:errorinopeningzipfile
  9. 0000001eClassLoaderUt<addDependentsExit
  10. /home/xxx/lib/struts/log4j.jar
  11. 0000001eClassLoaderUt3adding/home/xxx/lib/struts/log4j-core.jar
  12. 0000001eClassLoaderUt>addDependentsEntry
  13. /home/xxx/lib/struts/log4j-core.jar
  14. 0000001eClassLoaderUt3WARNING:couldnotopen/home/xxx/lib/struts/log4j-core.jar:errorinopeningzipfile
  15. 0000001eClassLoaderUt<addDependentsExit
  16. /home/xxx/lib/struts/log4j-core.jar
  17. 0000001eClassLoaderUt<addDependentsExit
  18. /home/xxx/lib/struts/commons-logging.jar
  19. ......
  20. 0000001eClassLoaderUt>addDependentsEntry
  21. /home/xxx/lib/struts/struts.jar
  22. 0000001eClassLoaderUt3dependentclasspathdetected:commons-beanutils.jarcommons-collections.jarcommons-digester.jarcommons-logging.jarcommons-validator.jarjakarta-oro.jarstruts-legacy.jar
  23. 0000001eClassLoaderUt3adding/home/xxx/lib/struts/jakarta-oro.jar
  24. 0000001eClassLoaderUt>addDependentsEntry
  25. /home/xxx/lib/struts/jakarta-oro.jar
  26. 0000001eClassLoaderUt3WARNING:couldnotopen/home/xxx/lib/struts/jakarta-oro.jar:errorinopeningzipfile
  27. 0000001eClassLoaderUt<addDependentsExit
  28. /home/xxx/lib/struts/jakarta-oro.jar
  29. 0000001eClassLoaderUt3adding/home/xxx/lib/struts/struts-legacy.jar
  30. 0000001eClassLoaderUt>addDependentsEntry
  31. /home/xxx/lib/struts/struts-legacy.jar
  32. 0000001eClassLoaderUt3WARNING:couldnotopen/home/xxx/lib/struts/struts-legacy.jar:errorinopeningzipfile
  33. 0000001eClassLoaderUt<addDependentsExit
  34. /home/xxx/lib/struts/struts-legacy.jar
  35. 0000001eClassLoaderUt<addDependentsExit
  36. ......



继续分析:
首先,可以确认的是WARNING所报的是正确的,因为可以通过确认所依赖的log4j.jar log4j-core.jar jakarta-oro.jar struts-legacy.jar之类的文件不存在。
其次,这些不存在的包是由谁依赖并需要加载的,通过日志的层次关系可以知道,commons-logging.jar需要log4j.jar log4j-core.jar,struts.jar需要jakarta-oro.jar struts-legacy.jar
这样唯一的可能就是各自的jar包中META-INF\MANIFEST.MF里声明了这些jar的依赖关系了。

打开commons-logging.jar,发现其中的META-INF\MANIFEST.MF里包含了
Class-Path: log4j.jar log4j-core.jar

打开struts.jar,发现其中的META-INF\MANIFEST.MF里包含了
Class-Path: commons-beanutils.jar commons-collections.jar commons-dig
ester.jar commons-logging.jar commons-validator.jar jakarta-oro.jar s
truts-legacy.jar

于是真相大白了,解决的办法要么增加相应版本所依赖的jar包,要么就是简单地删除Class-Path,根据应用程序的需要进行确认并使用之,[color=red]建议用前者进行解决。要么就升级这些组件包。[/color]

代码解读

Java代码 复制代码
  1. ClassLoaderUtils.java
  2. publicstaticString[]addDependentJars(Stringpaths[])
  3. {
  4. ArrayListnewPaths=newArrayList(Arrays.asList(paths));
  5. for(inti=0;i<paths.length;i++)
  6. if(paths[i].toLowerCase().endsWith(".jar"))
  7. addDependents(paths[i],newPaths);
  8. Stringresult[]=newString[newPaths.size()];
  9. result=(String[])(String[])newPaths.toArray(result);
  10. returnresult;
  11. }
  12. privatestaticvoidaddDependents(StringjarFileName,Listclasspath)
  13. {
  14. //...省略。。。
  15. jar=newJarFile(jarFileName);//错误在这一行
  16. manifest=jar.getManifest();
  17. attrs=manifest.getMainAttributes();
  18. dependents=attrs.getValue(java.util.jar.Attributes.Name.CLASS_PATH);//获取依赖包路径
  19. StringTokenizertokens=newStringTokenizer(dependents,"");
  20. do
  21. {
  22. if(!tokens.hasMoreTokens())
  23. break;
  24. StringnextDependent=tokens.nextToken();
  25. StringnextDependentFullPath=(newStringBuilder()).append(prefix).append(nextDependent).
  26. if(PathUtils.listAddNoDup(classpath,nextDependentFullPath))
  27. {
  28. addDependents(nextDependentFullPath,classpath);//迭代加载之
  29. }
  30. }while(true);
  31. //...省略。。。
  32. catch代码块中
  33. catch(ZipExceptionze)
  34. {
  35. Manager.Ffdc.log(ze,ClassLoaderUtils.class,"com.ibm.ws.classloader.ClassLoaderUtils.addDependents","238"+jarFileName);
  36. if(debugEnabled)
  37. Tr.debug(tc,(newStringBuilder()).append("WARNING:couldnotopen").append(jarFileName).append(":").append(ze.getLocalizedMessage()).toString());
  38. }
  39. catch(IOExceptionioe)
  40. {
  41. Manager.Ffdc.log(ioe,ClassLoaderUtils.class,"com.ibm.ws.classloader.ClassLoaderUtils.addDependents","246");
  42. if(debugEnabled)
  43. Tr.debug(tc,(newStringBuilder()).append("WARNING:I/Oexception").append(jarFileName).append(":").append(ioe.getLocalizedMessage()).toString());
  44. }



不厚道,在Manager.Ffdc.log里把jarFileName也打印出来,就更容易知道是什么问题了。
可见打印出有意义的信息对于分析问题是多少的重要。。。


附带信息:将commons-logging.jar与struts.jar与Spring 2.5.5发布所带的包进行对比分析,发现Spring带的commons-logging.jar包没有带有Class-Path这个条目。

Java代码 复制代码
  1. Manifest-Version:1.0
  2. Created-By:ApacheAnt1.5.1
  3. Extension-Name:org.apache.commons.logging
  4. Specification-Vendor:ApacheSoftwareFoundation
  5. Specification-Version:1.0
  6. Implementation-Vendor:ApacheSoftwareFoundation
  7. Implementation-Version:1.0.3
  8. Class-Path:log4j.jarlog4j-core.jar



对比

Java代码 复制代码
  1. Manifest-Version:1.0
  2. Archiver-Version:PlexusArchiver
  3. Created-By:ApacheMaven
  4. Built-By:dlg01
  5. Build-Jdk:1.4.2_16
  6. Implementation-Title:CommonsLogging
  7. Implementation-Vendor:ApacheSoftwareFoundation
  8. Implementation-Vendor-Id:org.apache
  9. Implementation-Version:1.1.1
  10. Specification-Title:CommonsLogging
  11. Specification-Vendor:ApacheSoftwareFoundation
  12. Specification-Version:1.0
  13. X-Compile-Source-JDK:1.2
  14. X-Compile-Target-JDK:1.1
  15. Extension-Name:org.apache.commons.logging



注意实现的版本问题是不同的

struct.jar包的条目内容不同

Java代码 复制代码
  1. Manifest-Version:1.0
  2. Created-By:ApacheAnt1.5.1
  3. Extension-Name:StrutsFramework
  4. Specification-Title:StrutsFramework
  5. Specification-Vendor:ApacheSoftwareFoundation
  6. Specification-Version:1.1
  7. Implementation-Title:StrutsFramework
  8. Implementation-Vendor:ApacheSoftwareFoundation
  9. Implementation-Vendor-Id:org.apache
  10. Implementation-Version:1.1
  11. Class-Path:commons-beanutils.jarcommons-collections.jarcommons-dig
  12. ester.jarcommons-logging.jarcommons-validator.jarjakarta-oro.jars
  13. truts-legacy.jar



对比

Java代码 复制代码
  1. Manifest-Version:1.0
  2. Ant-Version:ApacheAnt1.6.1
  3. Created-By:1.3.1_04-b02(SunMicrosystemsInc.)
  4. Extension-Name:StrutsFramework
  5. Specification-Title:StrutsFramework
  6. Specification-Vendor:TheApacheSoftwareFoundation
  7. Specification-Version:1.2.9
  8. Implementation-Title:StrutsFramework
  9. Implementation-Vendor:TheApacheSoftwareFoundation
  10. Implementation-Vendor-Id:org.apache
  11. Implementation-Version:1.2.9
  12. Class-Path:commons-beanutils.jarcommons-digester.jarcommons-fileup
  13. load.jarcommons-logging.jarcommons-validator.jarjakarta-oro.jar


也要注意实现的版本问题是不同的

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics