2013-11-19 4 views
6

У меня есть веб-приложение, которое я запускаю в окнах и среде linux. В Linux и только Linux я получаю следующее исключение:Имя зависимости несовместимо в google protobuf 2.5.0

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) 
     ... 

Так что я отлажена его как локально, так и удаленно, сравнивая результат. Я не могу понять следующее:

Env:

Protobuf-Java-2.5.0

Java 7


В обоих случаях я запускаю тот же веб-приложение и Я нахожусь в том же месте в коде, который является com.google.protobuf.Descriptors.java#245see code

Для контекста

... 
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."); 
     } 
     } 
... 

А вот информация из отладчика:

Окна:

dependencies[i].getName() = {[email protected]}"descriptor.proto" 
proto.getDependency(i) = {[email protected]}"descriptor.proto" 
dependencies[i].getClass().getProtectionDomain().getCodeSource().getLocation().getPath() = {[email protected]}"/C:/Apps/Apache/jakarta/tomcat/webapps/ROOT/WEB-INF/lib/protobuf-java-2.5.0.jar" 

Linux:

dependencies[i].getName() = {[email protected]}"google/protobuf/descriptor.proto" 
proto.getDependency(i) = {[email protected]}"descriptor.proto" 
dependencies[i].getClass().getProtectionDomain().getCodeSource().getLocation().getPath() = {[email protected]}"/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" 

Так как dependecies загружаются из Protobuf jar, который является байтовым индексом (проверен), но результат dependencies[i].getName() отличается от того, что в случае Linux вызывает DescriptorValidationException. Это то, что находится рядом с моим пониманием.

Любая помощь будет очень признательна.

ответ

9

Я думаю, что это относится к вашему other question. Важно, чтобы файл .proto всегда был импортирован с точно таким же именем. Скомпилированные классы от descriptor.proto включены в protobuf runtime, и он понимает, что имя должно быть google/protobuf/descriptor.proto. Если вы сделали копию descriptor.proto и не поместили ее в каталог с именем google/protobuf, но вместо этого просто сказали import "descriptor.proto"; в своем собственном файле, вы получите эту ошибку, потому что имена файлов не совпадают.

+1

Вы правы, как всегда (по крайней мере, когда дело доходит до protobuf :). Большое спасибо за усилия по поддержанию ответов protobuf! –

Смежные вопросы