我有几个.proto文件 syntax = "proto3";
. 我还有一个maven项目,用于构建hadoop/spark作业(hadoop2.7.1和spark 1.5.2)。我想在hadoop/spark中生成数据,然后根据proto3文件序列化它。
我使用libprotoc 3.0.0生成java源代码,只要pom.xml中有以下内容,这些源代码在maven项目中就可以正常工作:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.0.0-beta-1</version>
</dependency>
现在,当我在部署到集群的作业中使用libprotoc生成的类时,我遇到了:
java.lang.VerifyError : class blah overrides final method mergeUnknownFields.(Lcom/google/protobuf/UnknownFieldSet;)Lcom/google/protobuf/GeneratedMessage$Builder;
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
classloader失败似乎是合理的,因为hadoop/spark依赖于protobufjava2.5.0,这与我的3.0.0-beta-1不兼容。我还注意到protobufs(大概版本<3)已经在我的jar中的其他几个地方找到了它们的方法:
$ jar tf target/myjar-0.1-SNAPSHOT.jar | grep protobuf | grep '/$'
org/apache/hadoop/ipc/protobuf/
org/jboss/netty/handler/codec/protobuf/
META-INF/maven/com.google.protobuf/
META-INF/maven/com.google.protobuf/protobuf-java/
org/apache/mesos/protobuf/
io/netty/handler/codec/protobuf/
com/google/protobuf/
google/protobuf/
我能做些什么(maven shade?)来解决这个问题吗?
类似的问题:spark java.lang.verifyerror
2条答案
按热度按时间6gpjuf901#
这类事情在这里有记载:https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html
只需重新定位protobuffers,verifyerror就会消失:
lyfkaqu12#
与德兰索相同的解决方案,但采用sbt组装