NoClassDefFoundError:com / google / common / base / Preconditions,但Preconditions位于我的运行时类路径中的.jar文件中

时间:2013-08-02 10:05:18

标签: java guava

我有一个项目使用了来自Guava的ImmutableListImmutableSet。它编译得很好,但在运行时,使用相同的-cp,它会给出以下错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Preconditions
    at com.google.common.collect.RegularImmutableList.get(RegularImmutableList.java:81)
    at BasicPoint.pointAsArray(BasicPoint.java:93)
    at BasicPoint.inflate(BasicPoint.java:134)
    at BasicEdgeLength.<clinit>(BasicEdgeLength.java:32)
Caused by: java.lang.ClassNotFoundException: com.google.common.base.Preconditions
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 4 more

我使用此命令在终端中编译它

javac -cp '.:/MYPROJECTDIRECTORY/guava-14.0.1.jar'  BasicEdgeLength.java

并编译。然后我用这个命令运行它

java -cp '.:/MYPROJECTDIRECTORY/guava-14.0.1.jar'  BasicEdgeLength

我收到上述错误消息。 stackoverflow上有other questions关于完全相同的问题,但答案总是下载我已经完成的番石榴库。实际上,当我在guava-14.0.1.jar中浏览时,我可以看到文件com/google/common/base/Preconditions。事实上,我可以在.jar文件中看到错误消息中提到的类,这让我想象我只能通过下载更多文件来解决这个问题。所以我不知道该怎么做,你能提供的任何建议都将不胜感激。

我包含下面BasicPoint的代码,因为这是调用RegularImmutableList.get(i)的类,但请注意,BasicPoint不会在没有AbstractPoint的情况下编译,{{1} },IntMatrix,以及可能的其他一些东西(并且它不包含主要方法,可以在Initializer中找到)。如果有人认为有必要,我很乐意将代码附加到其他一些类中。

谢谢大家的时间!

BasicEdgeLength

1 个答案:

答案 0 :(得分:2)

一位朋友看了我项目中的文件并为我确定了问题。他注意到我的番石榴版本校验错了。我再次尝试安装它,问题仍然存在。我安装它的两次都打开并使用linux归档管理器将.jar文件保存到磁盘(这是我的Web浏览器中的默认行为)。我再试一次,这次使用wget下载.jar文件,这就解决了问题。因此故事的寓意似乎是:不要使用linux档案管理器将.jar文件保存到磁盘。