谷歌protobuf 2.5.0中的依赖名称不一致

Jan*_*yka 6 java protocol-buffers

我有一个Web应用程序,我在Windows和Linux环境中运行.在Linux和只有 Linux我得到以下异常:

Caused by:
java.lang.IllegalArgumentException: Invalid embedded descriptor for "moop_shared.proto".
        at com.google.protobuf.Descriptors$FileDescriptor.internalBuildGeneratedFileFrom(Descriptors.java:301)
        ...

Caused by:
com.google.protobuf.Descriptors$DescriptorValidationException: moop_shared.proto: Dependencies passed to FileDescriptor.buildFrom() don't match those listed in the FileDescriptorProto.
        at com.google.protobuf.Descriptors$FileDescriptor.buildFrom(Descriptors.java:246)
        at com.google.protobuf.Descriptors$FileDescriptor.internalBuildGeneratedFileFrom(Descriptors.java:299)
        ...
Run Code Online (Sandbox Code Playgroud)

所以我在本地和远程调试它比较结果.我无法理解以下内容:

ENV:

protobuf的-Java的2.5.0

java 7


在这两种情况下,我运行相同的webapp,我在代码中的相同位置,这是com.google.protobuf.Descriptors.java#245 看代码

对于上下文

...
for (int i = 0; i < proto.getDependencyCount(); i++) {
HERE --> if (!dependencies[i].getName().equals(proto.getDependency(i))) {
          throw new DescriptorValidationException(result,
            "Dependencies passed to FileDescriptor.buildFrom() don't match " +
            "those listed in the FileDescriptorProto.");
        }
      }
...
Run Code Online (Sandbox Code Playgroud)

以下是来自调试器的信息:

视窗:

dependencies[i].getName() = {java.lang.String@3681}"descriptor.proto"
proto.getDependency(i) = {java.lang.String@3682}"descriptor.proto"
dependencies[i].getClass().getProtectionDomain().getCodeSource().getLocation().getPath() = {java.lang.String@3846}"/C:/Apps/Apache/jakarta/tomcat/webapps/ROOT/WEB-INF/lib/protobuf-java-2.5.0.jar"
Run Code Online (Sandbox Code Playgroud)

Linux的:

dependencies[i].getName() = {java.lang.String@2444}"google/protobuf/descriptor.proto"
proto.getDependency(i) = {java.lang.String@2445}"descriptor.proto"
dependencies[i].getClass().getProtectionDomain().getCodeSource().getLocation().getPath() = {java.lang.String@2608}"/tmp/jetty-0.0.0.0-8080-cnc-webapp-1.6.3-SNAPSHOT.war-_-any-/webapp/WEB-INF/lib/protobuf-java-2.5.0.jar"
Run Code Online (Sandbox Code Playgroud)

因此,两个dependecies都是从protobuf jar加载的,它是字节不一致的(检查),但结果dependencies[i].getName()是不同的,在Linux的情况下会导致DescriptorValidationException.这是我理解的东西.

任何帮助都感激不尽.

Ken*_*rda 9

我认为这与你的另一个问题有关..proto始终以完全相同的名称导入特定文件非常重要.编译后的类descriptor.proto包含在protobuf运行时中,它理解名称google/protobuf/descriptor.proto.如果你制作了一个副本descriptor.proto并且没有把它放到一个名为的目录中google/protobuf,而只是import "descriptor.proto";在你自己的文件中说,你会得到这个错误,因为文件名不匹配.