我正在为一个类项目编写一些代码,该类项目将作业发送到GCP中的dataproc集群。我最近遇到了一个奇怪的错误,我很难把头绕在上面。错误如下:
Exception in thread "Thread-5" java.lang.NoClassDefFoundError: io/grpc/CallCredentials2
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at com.google.api.gax.grpc.GrpcCallContext.withCredentials(GrpcCallContext.java:160)
at com.google.api.gax.grpc.GrpcCallContext.withCredentials(GrpcCallContext.java:67)
at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:210)
at com.google.cloud.dataproc.v1.stub.GrpcJobControllerStub.create(GrpcJobControllerStub.java:130)
at com.google.cloud.dataproc.v1.stub.JobControllerStubSettings.createStub(JobControllerStubSettings.java:215)
at com.google.cloud.dataproc.v1.JobControllerClient.<init>(JobControllerClient.java:139)
at com.google.cloud.dataproc.v1.JobControllerClient.create(JobControllerClient.java:120)
at com.shayr.searchEngineGUI.searchEngineGUI.constructInvertedIndices(searchEngineGUI.java:509)
at com.shayr.searchEngineGUI.searchEngineGUI.access$0(searchEngineGUI.java:501)
at com.shayr.searchEngineGUI.searchEngineGUI$2.run(searchEngineGUI.java:474)
Caused by: java.lang.ClassNotFoundException: io.grpc.CallCredentials2
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 22 more
我的代码中触发此问题的行是:
JobControllerClient jobControllerClient = JobControllerClient.create(jobControllerSettings);
最初,我试着查找更多关于CallCredentials2的信息,以找出是什么原因造成了这个问题,但我找不到任何东西,除了这个类只是暂时的变通方法,而CallCredentials类正在进行更改,而且CallCredentials2已经贬值了。
我对google的了解是有限的,所以我花了一段时间才知道如何解决这个问题。我必须为我的项目更改一个依赖项,以便它将"grpc-api-1.42.1.jar“更改为"grpc-api-1.41.0.jar”,因为1.41版本的api是实现CallCredentials2类的版本。
因此,我的项目现在按预期工作,但我仍然不知道为什么我的代码要调用一个折旧类,如果可能的话,我宁愿避免它。有人知道为什么会这样吗?我使用的是最近更新的依赖项,所以我不知道为什么要调用折旧类。下面是我的pom.xml文件中列出的依赖项,然后将grpc版本更改为1.41.0:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-datastore</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-dataproc</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.32.2</version>
</dependency>
发布于 2021-11-29 15:52:13
使用mvn dependency:tree
,您可以在依赖树中发现GRPC-java-1.41.0和1.42.1版本的混合。:2.2.0引入了grpc :1.42.1,而其他依赖项则引入了grpc版本1.40.1。
grpc建议始终使用来自Maven执行器的requireUpperBoundDeps
来捕获Maven,悄悄地降级依赖项。
<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>
添加它会显示出许多失败,它们可以通过在google云数据存储之后订购google云存储来修复。但修正降级并不能解决你的问题。
让我们看看现在的版本(通过对依赖项进行重新排序):
$ mvn dependency:tree
[INFO] +- com.google.cloud:google-cloud-datastore:jar:2.2.0:compile
[INFO] | +- io.grpc:grpc-api:jar:1.42.1:compile
[INFO] | +- io.grpc:grpc-context:jar:1.42.1:compile
...
[INFO] +- com.google.cloud:google-cloud-dataproc:jar:2.2.0:compile
[INFO] | +- io.grpc:grpc-stub:jar:1.40.1:compile
[INFO] | +- io.grpc:grpc-protobuf:jar:1.40.1:compile
[INFO] | +- io.grpc:grpc-protobuf-lite:jar:1.40.1:compile
[INFO] | +- io.grpc:grpc-auth:jar:1.40.1:compile
[INFO] | +- io.grpc:grpc-netty-shaded:jar:1.40.1:compile
[INFO] | +- io.grpc:grpc-core:jar:1.40.1:compile
[INFO] | +- io.grpc:grpc-alts:jar:1.40.1:compile
[INFO] | +- io.grpc:grpc-grpclb:jar:1.40.1:compile
...
由于io.grpc:GRPC-auth1.40.1要求的是io.grpc:GRPC-API1.40.1,所以版本仍然中断,但我们使用的是1.42.1。Maven 能发现这样的情况,但不可靠。
您可以通过重新排序依赖项和显式添加一些依赖项来强制升级来解决这一问题,但这很繁琐。Google 建议使用BOM (也在数据存储,存储的文档中)选择一致的版本。<dependencyManagement>
部分选择要使用的库版本,但实际上并不依赖于它们。当使用BOM时,您不需要显式地指定BOM中依赖项的版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
<version>24.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-datastore</artifactId>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-dataproc</artifactId>
</dependency>
<dependency><!-- not part of the BOM -->
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.32.2</version>
</dependency>
</dependencies>
现在我们可以看到一致的版本:
$ mvn dependency:tree
...
[INFO] +- com.google.cloud:google-cloud-datastore:jar:2.1.3:compile
[INFO] | +- io.grpc:grpc-api:jar:1.41.0:compile
[INFO] | +- io.grpc:grpc-context:jar:1.41.0:compile
...
[INFO] +- com.google.cloud:google-cloud-dataproc:jar:2.2.2:compile
[INFO] | +- io.grpc:grpc-stub:jar:1.41.0:compile
[INFO] | +- io.grpc:grpc-protobuf:jar:1.41.0:compile
[INFO] | +- io.grpc:grpc-protobuf-lite:jar:1.41.0:compile
[INFO] | +- io.grpc:grpc-alts:jar:1.41.0:runtime
[INFO] | +- io.grpc:grpc-grpclb:jar:1.41.0:runtime
[INFO] | +- io.grpc:grpc-auth:jar:1.41.0:runtime
[INFO] | +- io.grpc:grpc-netty-shaded:jar:1.41.0:runtime
[INFO] | +- io.grpc:grpc-core:jar:1.41.0:runtime
...
https://stackoverflow.com/questions/70131564
复制相似问题