类路径已设置,但java.lang.NoClassDefFoundError com/google/protobuf/MessageOrBuilder错误?

类路径已设置,但java.lang.NoClassDefFoundError com/google/protobuf/MessageOrBuilder错误?,java,linux,classpath,protocol-buffers,Java,Linux,Classpath,Protocol Buffers,我正在尝试运行一个使用protobuf.jar的java程序,但我一直遇到这个错误 我在linux中设置了classpath变量,以便: CLASSPATH=/home/.../src/PlaceServer.class:/home/.../src/protobuf.jar:/home/.../src export CLASSPATH 但是当我在读了jar之后在命令行中运行我的程序时 java PServer 我明白了: java.lang.NoClassDefFoundError

我正在尝试运行一个使用protobuf.jar的java程序,但我一直遇到这个错误

我在linux中设置了classpath变量,以便:

 CLASSPATH=/home/.../src/PlaceServer.class:/home/.../src/protobuf.jar:/home/.../src
 export CLASSPATH
但是当我在读了jar之后在命令行中运行我的程序时

 java PServer 
我明白了:

 java.lang.NoClassDefFoundError: com/google/protobuf/MessageOrBuilder
然而,当我运行另一个同样读取同一jar的程序时,这个程序称为BServer

 java BServer
它工作得很好,而且正确,正如我所希望的那样。我甚至试着在这些命令下运行

 java -cp .protobuf.jar PServer
而且它仍然不适用于PServer

但是,如果我在Macbook上从命令行运行相同的程序(也在Eclipse中的任何一个操作系统中),我都不会出现这种异常,而且一切正常


谢谢你的帮助

要消除此错误,需要检查以下几项:

  • 验证应用程序的类路径中是否包含所有必需的Java类。最常见的错误是在开始执行依赖于某些外部库的Java应用程序之前,没有包含所有必需的类
  • 应用程序的classpath是正确的,但是classpath环境变量在应用程序执行之前被重写
在Eclipse中运行应用程序时,IDE通过使用项目文件夹中的.classpath文件来解决这个问题。当您构建一个应用程序(创建jar)时,您可能会意外地忽略这个类,或者更改它的位置


您需要做的是首先打开jar,并确保所讨论的类实际上位于jar内部,在相同的路径中。然后,浏览上面的列表。

我检查了,MessageOrBuilder.class确实存在于我在应用程序中使用的“protobuf.jar”中。那么你是说我应该检查你所说的两个要点中的任何一个?如果这个类应该在那个jar中,那么你必须正确地重新构建jar,使它处于应该的位置。或者,您可以自行编译该类并手动将其添加到jar中。我很好奇,你最初是怎么造这个罐子的?你应该考虑复习java教程。这是一个班级项目,所以我用了我教授给我们的那个坛子。我自己没有编译protobuf.jar,我会尝试这样做。@hfontanez这是错误的:“而且,条目应该用分号“;”分隔,而不是冒号“:”——这仅在Windows上是正确的。Nice kun似乎在Unix上。我已更正。谢谢肯顿·瓦尔达。你说得对。OP发布了(我忽略了)“我已经在Linux中设置了classpath变量…”错误表明
PServer
使用protobufs,但是Java没有正确地找到
protobuf.jar
。不过,我在类路径规范中没有看到任何明显的问题。您确定正确指定了
protobuf.jar
的路径吗?也许
BServer
可以正常工作,因为它根本不使用protobufs?也许它在mac上工作是因为文件位于不同的位置,或者因为
protobuf.jar
已经安装在某个公共位置?需要更多信息才能说.PS。现在有教授强迫学生使用我的代码,这有点疯狂!我希望你不要像我讨厌文学课上让我读的每一本书那样讨厌它我想我明白了,这很奇怪,出于某种原因,Java在不同的机器上读取的类路径不同,所以我不得不更明确地识别它。关于protobuf,它真的很酷,在课堂上学习新东西让人耳目一新!