簡體   English   中英

java.lang.NoClassDefFoundError用於在運行時下載的jar文件

[英]java.lang.NoClassDefFoundError for a jar file downloaded at run time

我的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執行行中添加了trace選項:
-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甚至不會在“ is not ”情況下搜索/home/ddg/aix/jtapi.jar!

我的猜測是,這是JVM for AIX 7.1中的一個錯誤,因為它在任何其他操作系統(包括早期版本的AIX)上都不是問題。

聽起來AIX上的JVM可能有一個默認的類加載器,用於檢查啟動時是否存在類路徑條目,並丟棄任何不存在的類路徑條目。 但是我無法在任何文檔中驗證。

難道你不能等到啟動應用程序,直到所有.jars完成下載?

如果你不能,你可能需要在代碼中使用自定義類加載器而不是調用Class.forName()

編輯:我一直在挖掘:系統類加載器sun.misc.Launcher$AppClassLoader將類路徑條目轉換為規范路徑 ,然后創建它們的文件URL數組。 但是不存在的文件的規范路徑是什么?

表示不存在的文件或目錄的每個路徑名也具有唯一的規范形式。 在創建文件或目錄之后,不存在的文件或目錄的路徑名的規范形式可能與相同路徑名的規范形式不同。 類似地,在刪除文件或目錄之后,現有文件或目錄的路徑名的規范形式可以與相同路徑名的規范形式不同。

也許在AIX上,現有文件和不存在文件的規范路徑名是不同的?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM