You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IntelliJ运行Flink Google Pub/Sub Connector报NoClassDefFoundError

我帮你分析下这个问题:虽然你已经确认目标Jar里存在GrpcPublisherStub类,但抛出的是类初始化失败的异常,而非单纯的类找不到,这通常是依赖冲突或者Maven Shade插件未正确处理gRPC/Protobuf的关键资源导致的。下面是针对性的解决方案:

1. 排查并解决gRPC依赖冲突

Flink 1.9.0本身依赖了特定版本的gRPC和Netty组件,而Google Pub/Sub客户端也会引入自己的gRPC版本,两者版本不一致时就会触发类加载异常。

  • 先执行mvn dependency:tree命令,查看输出中io.grpc相关依赖(比如grpc-netty、grpc-protobuf、grpc-stub)的版本,确认是否存在多版本冲突。
  • 最稳妥的解决方式是用Maven Shade插件的relocate功能,把Pub/Sub客户端的gRPC、Protobuf包重命名,彻底避免和Flink自带的依赖冲突。

给你的Shade插件添加relocate配置示例:

<transformers>
    <!-- 保留原有的主类配置 -->
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
        <mainClass>btc.da.StreamingJob</mainClass>
    </transformer>
    <!-- 重命名gRPC包 -->
    <transformer implementation="org.apache.maven.plugins.shade.resource.RelocateTransformer">
        <pattern>io.grpc</pattern>
        <shadedPattern>shaded.io.grpc</shadedPattern>
    </transformer>
    <!-- 重命名Protobuf包 -->
    <transformer implementation="org.apache.maven.plugins.shade.resource.RelocateTransformer">
        <pattern>com.google.protobuf</pattern>
        <shadedPattern>shaded.com.google.protobuf</shadedPattern>
    </transformer>
</transformers>

2. 修复Shade插件的资源文件处理

gRPC和Protobuf需要加载META-INF/services、META-INF/grpc目录下的配置文件来初始化服务,但你的现有Shade配置只处理了签名文件,没有合并这些关键资源,导致类初始化时找不到必要的服务实现。

修改Shade插件的配置,添加上资源合并的转换器:

<configuration>
    <artifactSet>
        <!-- 保留原有的exclude配置 -->
        <excludes>
            <exclude>org.apache.flink:force-shading</exclude>
            <exclude>com.google.code.findbugs:jsr305</exclude>
            <exclude>org.slf4j:*</exclude>
            <exclude>log4j:*</exclude>
        </excludes>
    </artifactSet>
    <filters>
        <filter>
            <artifact>*:*</artifact>
            <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
                <!-- 不要排除gRPC/Protobuf的资源文件 -->
            </excludes>
        </filter>
    </filters>
    <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>btc.da.StreamingJob</mainClass>
        </transformer>
        <!-- 合并META-INF/services下的服务注册文件 -->
        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
        <!-- 合并Protobuf的descriptor文件 -->
        <transformer implementation="org.apache.maven.plugins.shade.resource.ProtobufResourceTransformer"/>
    </transformers>
</configuration>

3. 检查JDK版本兼容性

从异常栈里的java.base/java.lang.Thread.run(Thread.java:835)能看出来你用的是JDK 11,但Flink 1.9.0的官方支持版本是JDK 8。Google Pub/Sub客户端在JDK 11下可能需要额外的模块配置,比如添加--add-modules java.se.ee启动参数,但最省心的方式还是切换到JDK 8运行你的Flink作业,大概率能解决这类初始化问题。

4. 验证修复效果

修改配置后,重新执行mvn clean package,然后用jar tf target/btc-utx-da-0.1.jar检查:

  • 确认META-INF/services/io.grpc.ManagedChannelProvider等文件存在且内容是合并后的
  • 如果用了relocate,确认shaded/io/grpc目录下有对应的类文件

内容的提问来源于stack exchange,提问作者Adelin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:25:48