导入具有内部类的类时的NoClassDefFoundError

时间:2010-02-19 22:21:49

标签: clojure noclassdeffounderror

我无法从jar中导入特定的类(FinanceService)。所有其他人都可以正常工作,包括内级FinanceService$Versions。我收到NoClassDefFound例外,我不知道该怎么办。

这个异常发生了,解释了我在这里找到的答案,当源代码成功编译时,但是在运行时,找不到所需的类文件,但我可以清楚地看到它在里面.jar,其第一个元素是:

META-INF/
META-INF/MANIFEST.MF
com/
com/google/
com/google/gdata/
com/google/gdata/client/
com/google/gdata/client/finance/
com/google/gdata/data/
com/google/gdata/data/finance/
com/google/gdata/client/finance/FinanceService$Versions.class
com/google/gdata/client/finance/FinanceService.class
com/google/gdata/client/finance/FinanceUtilities.class
com/google/gdata/client/finance/PortfolioQuery.class

为了确定,我重建了罐子,但仍然遇到了同样的错误。因为它是唯一一个都具有内部类并且无法加载的类,所以我认为必须有一种特殊的加载方式,但this code证明了相反的假设。知道该怎么办吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

那个jar显然有很多依赖,确保你在启动Clojure时将所有这些依赖于CLASSPATH。还要确保你没有混合版本。我跳过了你所在的gdata-finance-2.0.jar的下载链接,而是从你链接的项目页面下载http://gdata-java-client.googlecode.com/files/gdata-src.java-1.26.0.java.zip,其中包含gdata/java/lib中的大量jar文件,其中一个是金融罐子。所以我解压缩了一切并做到了这一点:

$ java -cp /path/to/clojure.jar:gdata/java/lib/* clojure.main
Clojure 1.2.0-master-SNAPSHOT
user=> (import '(com.google.gdata.client.finance FinanceService))
com.google.gdata.client.finance.FinanceService

这显然奏效了。但现在FinanceService$Versions不存在。它在FinanceService.java中也不存在。它可能是你所使用的库的不同版本,我的猜测。

如果你得到NoClassDefFound,请确保你注意它找不到的课程。 FinanceService可能会丢失,但也可能抱怨其中一个依赖项缺失。