grpc protobuf java中的NoSuchMethodException和NoClassDefFoundError
我启动了一个gRPC服务,一切正常,没有错误。但是,当我尝试使用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
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>