Liferay7.3集成Java版Analytics Data Client API遇grpc通道异常
问题场景
在Liferay 7.3中集成Java版Google Analytics Data Client API时,调用BetaAnalyticsDataClient.create(...)方法触发异常,异常信息如下:
io.grpc.ManagedChannelProvider$ProviderNotFoundException: No functional channel service provider found. Try adding a dependency on the grpc-okhttp, grpc-netty, or grpc-netty-shaded artifact
at io.grpc.ManagedChannelProvider.provider(ManagedChannelProvider.java:45)
at io.grpc.ManagedChannelBuilder.forAddress(ManagedChannelBuilder.java:39)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createSingleChannel(InstantiatingGrpcChannelProvider.java:351)
at com.google.api.gax.grpc.ChannelPool.(ChannelPool.java:105)
at com.google.api.gax.grpc.ChannelPool.create(ChannelPool.java:83)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createChannel(InstantiatingGrpcChannelProvider.java:236)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.getTransportChannel(InstantiatingGrpcChannelProvider.java:230)
at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:201)
at com.google.analytics.data.v1beta.stub.GrpcBetaAnalyticsDataStub.create(GrpcBetaAnalyticsDataStub.java:149)
at com.google.analytics.data.v1beta.stub.BetaAnalyticsDataStubSettings.createStub(BetaAnalyticsDataStubSettings.java:161)
at com.google.analytics.data.v1beta.BetaAnalyticsDataClient.(BetaAnalyticsDataClient.java:172)
at com.google.analytics.data.v1beta.BetaAnalyticsDataClient.create(BetaAnalyticsDataClient.java:154)
用户实现代码:
InputStream fileInputStream = GoogleAnalyticsReportsGA4Portlet.class.getResourceAsStream(KEY_FILE_LOCATION); GoogleCredentials credential = GoogleCredentials.fromStream(fileInputStream); BetaAnalyticsDataSettings betaAnalyticsDataSettings = BetaAnalyticsDataSettings.newBuilder() .setCredentialsProvider(FixedCredentialsProvider.create(credential)) .build(); try (BetaAnalyticsDataClient analyticsData = BetaAnalyticsDataClient.create(betaAnalyticsDataSettings)) {...}
解决方案
异常信息已经明确指出问题:项目缺少grpc的通道实现依赖。需要在项目依赖中添加以下任意一个grpc传输组件:
1. 添加grpc-okhttp依赖(适合轻量或Android场景)
<dependency> <groupId>io.grpc</groupId> <artifactId>grpc-okhttp</artifactId> <version>对应grpc版本号</version> </dependency>
2. 添加grpc-netty依赖
<dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> <version>对应grpc版本号</version> </dependency>
3. 添加grpc-netty-shaded依赖(规避netty版本冲突)
<dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>对应grpc版本号</version> </dependency>
额外注意事项
- 确保grpc版本与Google Analytics Data Client API依赖的grpc版本兼容,建议使用客户端API自带的依赖版本,避免版本冲突。
- 针对Liferay 7.3的OSGI环境,需保证依赖的bundle能被正确导入。如果使用Maven构建模块,可在
bnd.bnd文件中添加对应的导入声明,或通过compileOnly+provided的依赖方式处理,确保Liferay容器能正确加载相关类。
内容的提问来源于stack exchange,提问作者Addagar

