我有一个项目使用了来自Guava的ImmutableList
和ImmutableSet
。它编译得很好,但在运行时,使用相同的-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
答案 0 :(得分:2)
一位朋友看了我项目中的文件并为我确定了问题。他注意到我的番石榴版本校验错了。我再次尝试安装它,问题仍然存在。我安装它的两次都打开并使用linux归档管理器将.jar文件保存到磁盘(这是我的Web浏览器中的默认行为)。我再试一次,这次使用wget下载.jar文件,这就解决了问题。因此故事的寓意似乎是:不要使用linux档案管理器将.jar文件保存到磁盘。