Java 应用程序找不到访问 GCP Pub/Sub 的凭据
Posted
技术标签:
【中文标题】Java 应用程序找不到访问 GCP Pub/Sub 的凭据【英文标题】:Java application cannot find credentials to access GCP Pub/Sub 【发布时间】:2019-12-06 01:36:25 【问题描述】:我正在尝试使用 GCP Java SDK 使用以下代码向 Pub/Sub 主题发送消息(在此 sn-p 中用占位符替换了实际项目 ID 和主题名称):
Publisher publisher = null;
ProjectTopicName topic = ProjectTopicName.newBuilder()
.setProject("MY_PROJECT_ID")
.setTopic("MY_TOPIC")
.build();
try
publisher = Publisher.newBuilder(topic).build();
for (final String message : data)
ByteString messageBytes = ByteString.copyFromUtf8(message);
PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(messageBytes).build();
ApiFuture<String> future = publisher.publish(pubsubMessage);
catch (IOException ex)
ex.printStackTrace();
finally
if (publisher != null)
publisher.shutdown();
这会导致以下异常:
Exception in thread "main" java.lang.AbstractMethodError: com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.needsCredentials()Z
at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:157)
at com.google.cloud.pubsub.v1.stub.GrpcPublisherStub.create(GrpcPublisherStub.java:164)
at com.google.cloud.pubsub.v1.Publisher.<init>(Publisher.java:171)
at com.google.cloud.pubsub.v1.Publisher.<init>(Publisher.java:85)
at com.google.cloud.pubsub.v1.Publisher$Builder.build(Publisher.java:718)
at com.westonsankey.pubsub.MessageWriter.sendMessagesToPubSub(MessageWriter.java:35)
at com.westonsankey.pubsub.MessageWriter.main(MessageWriter.java:24)
我已将 GOOGLE_APPLICATION_CREDENTIALS
环境变量设置为指向 JSON 私钥文件,并确认我可以使用该私钥访问此应用程序中的其他 GCP 资源。该服务帐号拥有项目所有者,并且我已通过 Pub/Sub 控制台验证该服务帐号具有相应的权限。
使用 Pub/Sub 进行身份验证是否需要任何额外的步骤?
【问题讨论】:
作为测试,我将从我的 Java 代码中检索 GOOGLE_APPLICATION_CREDENTIALS 环境变量的值,以验证它确实被正确传递。我还将验证我是否已从运行 JVM 的用户那里读取文件的权限。 我认为应用程序访问环境变量指向的私钥文件不是问题,因为我已经确认我可以使用相同的身份验证访问应用程序中的其他 GCP 服务方法(使用 Cloud Storage 测试)。 在您的代码中,您使用了一个名为 publisher 的变量。该实例是如何构造的? 【参考方案1】:问题在于没有访问凭据。看起来这是 gax-java 库的版本冲突。 needsCredentials
方法于 2019 年 6 月在 v1.46 中添加。也许您明确依赖于旧版本,或者另一个依赖项正在拉入旧版本并泄漏他们拉入的版本。如果是前者,请更新拉在 1.46 或更高版本中。如果是后者,可能需要shade the dependency。
【讨论】:
以上是关于Java 应用程序找不到访问 GCP Pub/Sub 的凭据的主要内容,如果未能解决你的问题,请参考以下文章
包括自定义 PTransform 导致在 GCP 的 Dataflow 作业中找不到依赖项
如何为 gcp 中的组提供权限(创建/查看)并启用相同的日志记录
操作无法完成。找不到 Java 运行时。有关安装 Java 的信息,请访问 http://www.java.com