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

Spark Java应用打包为spark-submit可用的胖可运行Jar技术问询

用Maven打包Spark Java应用可运行Jar的解决方案

我之前也碰到过一模一样的场景——从普通Java项目转成Maven构建Spark应用时,怎么打出能正常用spark-submit运行的包含依赖的Jar确实需要调整配置。结合我的实践经验,给你两种靠谱的方案:

方案一:Maven Shade Plugin(首推)

Spark的依赖经常会和集群里的Hadoop、其他组件出现版本冲突,Shade插件能很好地处理包重定位、依赖合并这些问题,比普通打包插件更适配Spark场景。

直接把这段配置加到你的pom.xml的<build><plugins>节点里:

<!-- 先配置Java编译插件,确保JDK版本匹配 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>1.8</source> <!-- 改成你实际用的JDK版本,比如11 -->
        <target>1.8</target>
    </configuration>
</plugin>

<!-- Shade核心配置 -->
<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>
                <!-- 配置主类,和你之前导出Jar时MANIFEST.MF里的主类完全一致 -->
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.your.package.YourSparkMainClass</mainClass>
                    </transformer>
                </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

打包完成后,target目录下会生成一个带-shaded后缀的Jar文件,这个就是你要的包含所有依赖的可运行Jar,直接用spark-submit提交就行。

方案二:Maven Assembly Plugin(适合简单场景)

如果你的项目依赖很少、没有复杂的版本冲突,Assembly插件足够满足需求,配置也更简单:

把这段配置加到pom.xml的<build><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>com.your.package.YourSparkMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

运行同样的mvn clean package命令,target目录下会生成带-jar-with-dependencies后缀的Jar,同样可以用spark-submit运行。

额外提醒

  • 如果你是在Spark集群上运行,记得把Spark核心依赖(比如spark-core、spark-sql)的scope设置为provided,因为集群环境本身已经有这些依赖了,重复打包反而容易出冲突:
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.12</artifactId>
    <version>3.3.0</version> <!-- 改成你用的Spark版本 -->
    <scope>provided</scope>
</dependency>
  • 一定要确认主类的全路径正确,不然spark-submit会找不到入口类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:46:07