我有一个简单的程序(用Java编写),它使用谷歌协议缓冲区,它可以在Windows机器上正常工作。
但是当我在linux机器上运行时,我得到以下异常:
com.google.protobuf.Descriptors$FileDescriptor.internalBuildGeneratedFileFrom(Ljava/lang/String;[Lcom/google/protobuf/Descriptors$FileDescriptor;Lcom/google/protobuf/Descriptors$FileDescriptor$InternalDescriptorAssigner;
at com.test.integration.protocols.protocolBuffers.messages.TestMsgs.<clinit>(TestMsgs.java:5111)
at com.test.integration.protocols.protocolBuffers.messages.TestMsgs$SessionInfo.<clinit>(TestMsgs.java:3346)
at com.test.integration.protocols.protocolBuffers.messages.TestMsgs$TestRequest.<init>(TestMsgs.java:782)
at com.test.integration.protocols.protocolBuffers.messages.TestMsgs$TestRequest.<clinit>(TestMsgs.java:760)
at com.test.simulators.TestJmsListener.onMessage(TestJmsListener.java:80)
at org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1215)
at org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
at org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:122)
at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:43)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
我在两台机器中使用相同的jar文件作为协议缓冲区。
答案 0 :(得分:2)
Protoc和protobuf运行时库(jar)紧密耦合。您不能将较旧的protoc与较新的运行时一起使用,反之亦然。请仔细检查您在Windows和Linux上使用完全相同版本的protobuf jar文件,此版本与您用于生成Java代码的protoc版本相同。