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

生成Dataflow自执行JAR遇JNI错误:ClassNotFoundException求助

解决Dataflow JAR运行时的NoClassDefFoundError问题

你碰到的这个NoClassDefFoundError是典型的依赖缺失问题——你用maven-jar-plugin打包出来的JAR只包含了自己的业务代码,并没有把Beam、GCP相关的依赖类打包进去,所以运行时JVM找不到org.apache.beam.sdk.options.PipelineOptions这类核心类。下面给你两种靠谱的解决方案:

方案1:使用maven-shade-plugin(推荐,适配Beam生态)

Beam项目经常会遇到依赖冲突的情况,maven-shade-plugin不仅能把所有依赖打包进同一个JAR,还能处理类冲突(比如重名类合并),是Beam官方推荐的打包方式。把以下配置添加到你的POM文件的<plugins>节点中:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <!-- 配置主类,确保JAR可直接运行 -->
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>SampleWindowJar</mainClass>
                    </transformer>
                    <!-- Beam必需的转换器,处理服务加载器配置文件合并 -->
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                </transformers>
                <!-- 可选:排除签名文件,避免打包后出现验证错误 -->
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

执行打包命令:

mvn clean package

打包完成后,运行生成的带依赖的JAR(文件名通常会包含shaded标识):

java -jar target/sample-1.0.0-shaded.jar

方案2:使用maven-assembly-plugin(快速生成胖包)

如果只是临时测试,也可以用maven-assembly-plugin快速打包所有依赖:

添加到POM的<plugins>节点:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.3.0</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <mainClass>SampleWindowJar</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

执行打包命令:

mvn clean package assembly:single

运行生成的包含所有依赖的JAR:

java -jar target/sample-1.0.0-jar-with-dependencies.jar

为什么原配置无法运行?

你之前用的maven-jar-plugin只是生成了一个仅包含自身代码的「瘦JAR」,它的addClasspath配置只是在MANIFEST文件中声明了依赖路径,但这些依赖JAR并没有和你的业务代码打包在一起,所以运行时JVM找不到对应的类文件。

额外提示

  • 如果你要将这个JAR提交给Airflow调度,确保使用上述方式生成包含所有依赖的胖包,Airflow无需额外配置依赖路径
  • Beam 2.11.0是比较老旧的版本,建议升级到较新的稳定版本,避免一些已知的兼容性问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:30:21