【发布时间】:2012-03-12 01:44:17
【问题描述】:
我的 java 应用程序启动如下: /usr/java6_64/bin/java -cp main.jar:updater.jar:jtapi.jar
在某些情况下 jtapi.jar 不存在,而是在运行时下载。 main.jar 和 updater.jar 旨在解决这个问题。这可以在包括 AIX 5.3 在内的多个操作系统上完美运行。
但是,在 AIX 7.1 上,如果 jtapi.jar 一开始不存在,它就会失败。这是一个例外:
Exception in thread "main" java.lang.NoClassDefFoundError: com.cisco.jtapi.extensions.CiscoProviderObserver
at java.lang.ClassLoader.defineClass(ClassLoader.java:275)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:69)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:540)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:451)
at java.net.URLClassLoader.access$300(URLClassLoader.java:79)
at java.net.URLClassLoader$ClassFinder.run(URLClassLoader.java:1038)
at java.security.AccessController.doPrivileged(AccessController.java:284)
at java.net.URLClassLoader.findClass(URLClassLoader.java:429)
at java.lang.ClassLoader.loadClass(ClassLoader.java:660)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:358)
at java.lang.ClassLoader.loadClass(ClassLoader.java:626)
at com.genesyslab.ciscocm.JtapiUpdater.main(JtapiUpdater.java:107)
Caused by: java.lang.ClassNotFoundException: com.cisco.jtapi.extensions.CiscoProviderObserver
at java.net.URLClassLoader.findClass(URLClassLoader.java:434)
at java.lang.ClassLoader.loadClass(ClassLoader.java:660)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:358)
at java.lang.ClassLoader.loadClass(ClassLoader.java:626)
at java.lang.ClassLoader.defineClassImpl(Native Method)
... 12 more
之后立即再次运行它,它工作正常,因为 jtapi.jar 已经存在。 我已经验证 jtapi.jar 文件已经下载成功,甚至增加了延迟以确保它有时间。同样,这目前在早期版本的 AIX 和其他操作系统上运行良好。
有什么想法吗?
编辑: 到目前为止,“消除不存在的文件”理论似乎最适合。我使用下面的代码检查了规范的想法,无论是否存在 jtapi.jar,输出都是相同的:
File jtapiFile = new File(".", JTAPI_JARFILE);
try {
LogMain("JtapiUpdater: getCanonicalPath() " + jtapiFile.getCanonicalPath() + ".");
} catch (IOException e) {}
输出:
JtapiUpdater:getCanonicalPath() /home/ddg/aix/jtapi.jar。
但是,我仍然没有一个简单的方法来解决这个问题。
编辑:
我在 java 执行行中添加了跟踪选项:
-Dibm.cl.verbose=com.cisco.jtapi.extensions.CiscoProviderObserver
-Dibm.dg.trc.methods=java/lang/ClassLoader.*() -Dibm.dg.trc.print=mt
这些输出加载器如何找到类。这是它显示的内容......
如果 jtapi.jar 最初不存在但由 updater.jar 下载:
AppClassLoader attempting to find com.cisco.jtapi.extensions.CiscoProviderObserver
AppClassLoader using classpath /home/ddg/aix/ccm-tserver.jar:/home/ddg/aix/updater.jar:/home/ddg/aix/jtapi.jar
AppClassLoader could not find com/cisco/jtapi/extensions/CiscoProviderObserver.class in /home/ddg/aix/ccm-tserver.jar
AppClassLoader could not find com/cisco/jtapi/extensions/CiscoProviderObserver.class in /home/ddg/aix/updater.jar
AppClassLoader could not find com.cisco.jtapi.extensions.CiscoProviderObserver
如果 jtapi.jar 存在:
AppClassLoader attempting to find com.cisco.jtapi.extensions.CiscoProviderObserver
AppClassLoader using classpath /home/ddg/aix/ccm-tserver.jar:/home/ddg/aix/updater.jar:/home/ddg/aix/jtapi.jar
AppClassLoader could not find com/cisco/jtapi/extensions/CiscoProviderObserver.class in /home/ddg/aix/ccm-tserver.jar
AppClassLoader could not find com/cisco/jtapi/extensions/CiscoProviderObserver.class in /home/ddg/aix/updater.jar
AppClassLoader found com/cisco/jtapi/extensions/CiscoProviderObserver.class in /home/ddg/aix/jtapi.jar
AppClassLoader found com.cisco.jtapi.extensions.CiscoProviderObserver
请注意 AppClassLoader 在“不是”的情况下甚至不搜索 /home/ddg/aix/jtapi.jar,即使 jtapi.jar 已成功下载并列在类路径中!
我的猜测是,这是 AIX 7.1 的 JVM 中的一个错误,因为它在任何其他操作系统(包括早期版本的 AIX)上都不是问题。
【问题讨论】:
-
您的问题不清楚。您是说第一次运行以
NoClassDefFoundError结束,后续运行成功? -
正确。在第一次运行期间,应用程序下载 jtapi.jar 然后失败并出现此异常。由于 jtapi.jar 已经存在,因此再次运行该应用程序。
标签: java jar aix noclassdeffounderror