問題なく、play フレームワーク 2.1.3 で protobufs を使用しています。次に、protobufs を JSON に変換する必要があったため、含めました。
"com.googlecode.protobuf-java-format" % "protobuf-java-format" % "1.2"
Build.scala で。
を使用してprotobufをJSONに変換しようとしています
JsonFormat.printToString(message);
これにより、dev モード (play run で開始) で実行すると、次のエラーが発生します。
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]
プロダクション モードでプレイを開始すると、エラーは発生しません。
app フォルダーに protobuf-java-format のソース コードを配置すると、開発モードで動作させることができました。一時的な解決策としてこれは機能しますが、この問題に対処する正しい方法を知りたいです。
追加情報: 以下の提案に従って、play クラスパス、play 依存関係を確認し、システムを検索しましたが、含まれている jar のコピーは 1 つだけです。
問題なく実行できます:
Exception e = new InvalidProtocolBufferException()
protobuf-java-format ライブラリの静的メソッドを使用しようとすると、NoClassDefFoundError がスローされます。例えば:
XmlFormat.printToString(message)
開発モードでは動作しませんが、本番環境 (再生開始) では動作します。興味深いことに、見つからないと言っているクラスは異なります。
[RuntimeException: java.lang.NoClassDefFoundError: com/google/protobuf/Message]
他の場所では問題なく protobuf ライブラリのメソッドを使用しているため、それらがクラス パスに含まれていることはわかっています。
Google から、同様の問題を抱えている別のインスタンスを 1 つ見つけることができました: https://groups.google.com/forum/#!msg/play-framework/i0RNcu8PZOY/J7cy18xsg3oJ
コードをリファクタリングして機能させる方法を理解できませんでした。