2013-09-18 2 views
3

Я работаю с protobufs с платформой воспроизведения 2.1.3 без проблем. Затем мне нужно было преобразовать протобуфы в JSON, поэтому я включилPlay framework java.lang.NoClassDefFoundError только в режиме dev

"com.googlecode.protobuf-java-format" % "protobuf-java-format" % "1.2" 

в Build.scala.

Попытка тайной любой Protobuf в формат JSON с использованием

JsonFormat.printToString(message); 

Это приводит к следующей ошибке при работе в режиме разработчика (начал с игрой запуском)

play.api.Application$$anon$1: Execution exception[[RuntimeException: java.lang.NoClassDefFoundError: com/google/protobuf/InvalidProtocolBufferException]] 
... 
Caused by: java.lang.NoClassDefFoundError: com/google/protobuf/InvalidProtocolBufferException 
... 
Caused by: java.lang.ClassNotFoundException: com.google.protobuf.InvalidProtocolBufferException 
at java.net.URLClassLoader$1.run(URLClassLoader.java:202) ~[na:1.6.0_51] 
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_51] 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) ~[na:1.6.0_51] 
at java.lang.ClassLoader.loadClass(ClassLoader.java:306) ~[na:1.6.0_51] 
at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ~[na:1.6.0_51] 
at sbt.PlayCommands$$anonfun$53$$anonfun$55$$anon$2.loadClass(PlayCommands.scala:535) ~[na:na] 

Если игра запускается в рабочем режиме У меня нет никаких ошибок.

Я смог заставить его работать в режиме dev, если я поместил исходный код для protobuf-java-format в папку своего приложения. В качестве временного решения это работает, но я хотел бы знать правильный способ решения этой проблемы.

Дополнительная информация: По предложению ниже, я проверил путь к игре, заработал зависимостей и выполнил поиск в моей системе, и у меня есть только одна копия включенной банки.

Я могу работать без проблем:

Exception e = new InvalidProtocolBufferException() 

NoClassDefFoundError отбрасывается, когда я пытаюсь использовать любой статический метод из библиотеки Protobuf-ява-формате. Например:

XmlFormat.printToString(message) 

Не работает в режиме dev, но работает в режиме производства (начало игры). Интересно, что класс он говорит, что не может найти другое:

[RuntimeException: java.lang.NoClassDefFoundError: com/google/protobuf/Message] 

Я использую методы из библиотеки Protobuf без проблем в других местах, так что я знаю, что они включаются в пути класса.

от Google, я был в состоянии найти еще один экземпляр, который имеет аналогичные проблемы: https://groups.google.com/forum/#!msg/play-framework/i0RNcu8PZOY/J7cy18xsg3oJ

Я не был в состоянии понять, как реорганизовать код, чтобы заставить его работать.

ответ

0

Вы уверены, что класс существует в 1.2? Я вижу, что он существует в версии 2.3.

http://grepcode.com/file/repo1.maven.org/maven2/com.google.protobuf/protobuf-java/2.3.0/com/google/protobuf/InvalidProtocolBufferException.java

Это звучит как вопрос, то загрузчик классов, где Protobuf-ява-формат банка находится в одном загрузчике классов, который не имеет доступа к другой баночке. Лучше всего убедиться, что эта банка и другая банда protobuf попадают в тот же каталог, когда вы запускаете приложение, чтобы они оказались в одном и том же загрузчике классов.

Другие вещи, которые вы можете сделать, это класс вызова в каждом и получить классный загрузчик и обмануть себя, получив родитель-загрузчик классов, а также посмотреть, как выглядит иерархия класса loader.

Еще один очень полезный метод для игры с при отладке - XXXXX.class.getProtectionDomain(). GetCodeSource().getLocation()

замените XXXXX классом, который существует в protobuf, как класс Exception, который не имеет проблем с загрузкой вашего класса, и protobuf-java-format имеет проблему загрузки, а также любой класс из protobuf-java-format. Это скажет вам, где JVM загружает два баночки.

+0

Я использую 2.3 для библиотеки protobuf. [Protobuf java format] (https://code.google.com/p/protobuf-java-format/) - отдельный проект для сериализации protobuf для JSON, XML или HTML. –

+0

упростите проблему, затем ... выньте protobuf-java-format и вместо этого добавьте такой код, как Exception e = new InvalidProtocolBufferException(), чтобы увидеть, работает ли это в первую очередь. Как вы включаете банку, и уверены ли вы, что в пути классов нет нескольких версий? Убедитесь, что вы просматриваете файловую систему для всех * .jars и убедитесь, что у вас нет двух версий. –

+0

Пытался включить подробную информацию о всех предложениях. Я отредактировал сообщение выше с подробностями –

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