grpc protobuf java中的NoSuchMethodException和NoClassDefFoundError

grpc protobuf java中的NoSuchMethodException和NoClassDefFoundError,java,protocol-buffers,grpc,noclassdeffounderror,nosuchmethoderror,Java,Protocol Buffers,Grpc,Noclassdeffounderror,Nosuchmethoderror,我启动了一个gRPC服务,一切正常,没有错误。但是,当我尝试使用grpcui(/grpcui-plaintext localhost:9900)来读取和访问服务时,我得到以下信息: Exception in thread "grpc-default-executor-0" java.lang.NoSuchMethodError: com.google.protobuf.Descriptors$FileDescriptor.internalBuildGeneratedFileFrom([Ljava

我启动了一个gRPC服务,一切正常,没有错误。但是,当我尝试使用
grpcui
/grpcui-plaintext localhost:9900
)来读取和访问服务时,我得到以下信息:

Exception in thread "grpc-default-executor-0" java.lang.NoSuchMethodError: com.google.protobuf.Descriptors$FileDescriptor.internalBuildGeneratedFileFrom([Ljava/lang/String;[Lcom/google/protobuf/Descriptors$FileDescriptor;)Lcom/google/protobuf/Descriptors$FileDescriptor;
    at io.grpc.reflection.v1alpha.ServerReflectionProto.<clinit>(ServerReflectionProto.java:103)
    at io.grpc.reflection.v1alpha.ServerReflectionGrpc$ServerReflectionBaseDescriptorSupplier.getFileDescriptor(ServerReflectionGrpc.java:234)
    at io.grpc.protobuf.services.ProtoReflectionService$FileDescriptorIndex.<init>(ProtoReflectionService.java:418)
    at io.grpc.protobuf.services.ProtoReflectionService$ServerReflectionIndex.<init>(ProtoReflectionService.java:339)
    at io.grpc.protobuf.services.ProtoReflectionService.updateIndexIfNecessary(ProtoReflectionService.java:97)
    at io.grpc.protobuf.services.ProtoReflectionService.serverReflectionInfo(ProtoReflectionService.java:136)
    at io.grpc.reflection.v1alpha.ServerReflectionGrpc$MethodHandlers.invoke(ServerReflectionGrpc.java:220)
    at io.grpc.stub.ServerCalls$StreamingServerCallHandler.startCall(ServerCalls.java:224)
    at io.grpc.internal.ServerImpl$ServerTransportListenerImpl.startWrappedCall(ServerImpl.java:648)
    at io.grpc.internal.ServerImpl$ServerTransportListenerImpl.startCall(ServerImpl.java:626)
    at io.grpc.internal.ServerImpl$ServerTransportListenerImpl.access$1900(ServerImpl.java:417)
    at io.grpc.internal.ServerImpl$ServerTransportListenerImpl$1StreamCreated.runInternal(ServerImpl.java:556)
    at io.grpc.internal.ServerImpl$ServerTransportListenerImpl$1StreamCreated.runInContext(ServerImpl.java:531)
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
我的Maven依赖项是:

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>1.26.0</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-core</artifactId>
            <version>1.26.0</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty</artifactId>
            <version>1.26.0</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-services</artifactId>
            <version>1.26.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>23.6.1-jre</version>
        </dependency>

        <dependency>
            <groupId>com.google.api.grpc</groupId>
            <artifactId>proto-google-common-protos</artifactId>
            <version>0.1.9</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-testing</artifactId>
            <version>1.26.0</version>
            <scope>testing</scope>
        </dependency>

io.grpc
grpc存根
1.26.0
io.grpc
grpc核心
1.26.0
io.grpc
grpc netty
1.26.0
io.grpc
grpc服务
1.26.0
番石榴
番石榴
23.6.1-jre
com.google.api.grpc
通用原型
0.1.9
io.grpc
grpc测试
1.26.0
测试
已经尝试了
guava
io.grpc
版本的不同组合,没有任何区别。
有人对此有什么想法吗?

在v3.8中,特定的FileDescriptor.internalBuildGeneratedFileFrom()方法被添加到Protobuf中。通常,
NoSuchMethodError
错误是由依赖项降级引起的,通常是由Maven引起的

您可以运行
mvn dependency:tree
来检查正在使用的依赖项的版本。在本例中,您会发现
com.google.api.grpc:proto-google-common-protos:0.1.9
取决于
com.google.protobuf:protobuf-java:3.2.0
,这就是Maven使用的版本

gRPC团队建议始终使用Maven Enforcer的
requireUpperBoundDeps
来检测Maven在选择版本时的错误。您可以将以下内容添加到pom.xml中:

    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.4.1</version>
        <executions>
          <execution>
            <id>enforce</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireUpperBoundDeps/>
              </rules>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>

...
org.apache.maven.plugins
maven enforcer插件
1.4.1
执行
执行
当它在构建过程中检测到故障时,它会提供其他地方依赖的版本。选择最大版本并将其作为显式依赖项添加到项目中:

    <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>3.11.0</version>
    </dependency>

com.google.protobuf
protobuf java
3.11.0

我还将注意到,proto-google-common-protos:0.1.9非常古老。我建议更新到更新的版本,比如1.17.0。尽管您在使用1.17.0时仍会遇到此问题。

非常翔实且详尽的答案,谢谢您,先生!你指出了问题所在;我使用了更旧版本的grpc来生成java文件。grpc支持旧生成的代码。所以,如果您使用一个旧的protoc gen grpc java可执行文件,那么应该仍然可以运行。
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>1.26.0</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-core</artifactId>
            <version>1.26.0</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty</artifactId>
            <version>1.26.0</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-services</artifactId>
            <version>1.26.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>23.6.1-jre</version>
        </dependency>

        <dependency>
            <groupId>com.google.api.grpc</groupId>
            <artifactId>proto-google-common-protos</artifactId>
            <version>0.1.9</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-testing</artifactId>
            <version>1.26.0</version>
            <scope>testing</scope>
        </dependency>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.4.1</version>
        <executions>
          <execution>
            <id>enforce</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireUpperBoundDeps/>
              </rules>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
    <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>3.11.0</version>
    </dependency>