2014-10-26 75 views
0

我想用asm庫來測試Apache Commons Math,當我嘗試使用ClassWriter將其寫入文件時,會拋出一些ClassNotFoundException。拋出錯誤ClassNotFoundException在asm.ObjectWriter.getCommonSuperClass

一類是org/apache/commons/math3/linear/RealVector.class

堆棧跟蹤是:

java.lang.RuntimeException: java.lang.ClassNotFoundException: org.apache.commons.math3.linear.Array2DRowRealMatrix 
at org.objectweb.asm.ClassWriter.getCommonSuperClass(Unknown Source) 
at org.objectweb.asm.ClassWriter.a(Unknown Source) 
at org.objectweb.asm.Frame.a(Unknown Source) 
at org.objectweb.asm.Frame.a(Unknown Source) 
at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source) 
at org.objectweb.asm.tree.MethodNode.accept(Unknown Source) 
at org.objectweb.asm.tree.MethodNode.accept(Unknown Source) 
at org.objectweb.asm.tree.ClassNode.accept(Unknown Source) 

我GOOGLE了異常,所有我能找到的是有關該間沒有一定的Cobertura問題,或其他不相關的庫沒有幫助。

這甚至發生在我根本不執行任何檢測的情況下。我也嘗試將缺少的類明確地添加到類路徑中,但這也不起作用。

任何想法?

+0

根據堆棧跟蹤,這意味着你缺少commons-math * jar?你的類路徑中是否有asm * .jar? – SMA 2014-10-26 14:30:39

+0

asm.jar是我用來運行檢測的jar的一部分。我沒有將commons-math作爲jar添加,而是在手動構建它的目標/ classes文件夾後添加的 – user1839433 2014-10-26 14:34:58

回答

0

問題在於您的環境中的ASM是從引導類的classloder中加載的,而對於其他classloader的math3類是加載的。 當ClassWriter調用「getCommonSuperClass」時,它會調用「GetClass()。GetClassLoader()」,這會給他啓動類加載器。 但是,它試圖合併RealVector(已經加載)和Array2DRowRealMatrix的幀,後者不能使用引導類加載器找到。

一個解決方案是,如果您自己使用調用ClassWriter - 刪除指示編寫者計算幀的標誌。

另一種解決方法是嘗試從系統加載程序加載ASM。