我的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,则会失败。以下是异常情况:
如果 jtapi.jar 存在:
请注意,即使jtapi.jar已成功下载并列在类路径中,AppClassLoader在“不是”情况下甚至不搜索/home/ddg/aix/jtapi.jar!我的猜测是这是AIX 7.1的JVM中的一个错误,因为它在任何其他操作系统上,包括早期版本的AIX中都没有问题。
但是,在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
请注意,即使jtapi.jar已成功下载并列在类路径中,AppClassLoader在“不是”情况下甚至不搜索/home/ddg/aix/jtapi.jar!我的猜测是这是AIX 7.1的JVM中的一个错误,因为它在任何其他操作系统上,包括早期版本的AIX中都没有问题。