【发布时间】:2022-01-04 22:29:44
【问题描述】:
我正在为一个将作业发送到 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 apis 的了解有些有限,所以我花了一段时间才弄清楚如何解决这个问题。我必须更改我的项目的依赖项之一,以便将“grpc-api-1.42.1.jar”更改为“grpc-api-1.41.0.jar”,因为 1.41 版本的 api 是实现的CallCredentials2 类。
所以我的项目现在按预期工作,但我仍然不确定为什么我的代码调用了一个折旧的类,如果可能的话,我宁愿避免这种情况。有谁知道为什么会这样?我正在使用最近更新的依赖项,所以我不确定为什么要调用折旧的类。以下是在将 grpc 版本更改为 1.41.0 之前在我的 pom.xml 文件中列出的依赖项:
<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>
【问题讨论】:
-
您的问题是 ClassNotFoundException。在这种情况下,它已被删除。修改代码以使用 CallCredentials。请参阅此链接以设置 jars/imports:github.com/grpc/grpc-java
标签: google-cloud-platform grpc google-cloud-dataproc grpc-java