【问题标题】:How to override method in uber jar?如何覆盖 uber jar 中的方法?
【发布时间】:2017-01-21 00:35:29
【问题描述】:

我正在尝试将此代码与 Google Cloud Datastore 一起使用:

Query<Entity> query = Query.entityQueryBuilder()
    .kind("Task")
    .filter(PropertyFilter.hasAncestor(
        datastore.newKeyFactory().kind("TaskList").newKey("default")))
    .build();
datastore.run(query, ReadOption.eventualConsistency());

我收到此错误:

线程“主”java.lang.VerifyError 中的异常:类 com.google.datastore.v1.ReadOptions$Builder 覆盖 final 方法 mergeUnknownFields.(Lcom/google/protobuf/UnknownFieldSet;)Lcom/google/protobuf/GeneratedMessage$Builder; 在 java.lang.ClassLoader.defineClass1(Native Method) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:763) 在 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 在 java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 在 java.net.URLClassLoader.access$100(URLClassLoader.java:73) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:368) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:362) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:361) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在 com.google.datastore.v1.ReadOptions.toBuilder(ReadOptions.java:392) 在 com.google.datastore.v1.ReadOptions.newBuilder(ReadOptions.java:386) 在 com.google.cloud.datastore.DatastoreImpl.toReadOptionsPb(DatastoreImpl.java:217) 在 com.google.cloud.datastore.DatastoreImpl.run(DatastoreImpl.java:78)

一些一般细节:

  • 语言:斯卡拉
  • 运行于:Google 计算引擎
  • 使用 com.google.guava:guava:19.0 和 com.google.cloud:google-cloud:0.3.0 依赖项
  • 这是来自 google.datastore.v1.protos 的代码

    public final Builder mergeUnknownFields( 最终 com.google.protobuf.UnknownFieldSet unknownFields) { 返回这个; }

  • 这是来自 com.google.protobuf.GeneratedMessage 的代码

        public BuilderType mergeUnknownFields(UnknownFieldSet unknownFields) {
        this.unknownFields = UnknownFieldSet.newBuilder(this.unknownFields).mergeFrom(unknownFields).build();
        this.onChanged();
        return this;
    }
    

`

【问题讨论】:

    标签: scala cloud google-compute-engine google-cloud-datastore gcloud-java


    【解决方案1】:

    添加阴影依赖解决了 spark/google 云客户端 api 冲突问题,使用:

    <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <relocations>
                                <relocation>
                                    <pattern>com.google</pattern>
                                    <shadedPattern>shaded.com.google</shadedPattern>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                </executions>
            </plugin> 
    

    【讨论】:

      【解决方案2】:

      我认为这是this issue 中描述的问题的症状。

      【讨论】:

      • 是的,我也相信这个问题是由于我的 spark 和 Google Cloud Client api 之间的 ptotobuf 协议的版本不匹配造成的(相同的 proc 在没有 spark 的情况下在同一个集群上运行。不幸的是,使用 Google cloud dataproc 服务(用于并行处理)spark 类是从服务映像中预加载的。
      猜你喜欢
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多