一、简介#

在提交大数据作业到集群上运行时,通常需要先将项目打成 JAR 包。这里以 Maven 为例,常用打包方式如下:

  • 不加任何插件,直接使用 mvn package 打包;
  • 使用 maven-assembly-plugin 插件;
  • 使用 maven-shade-plugin 插件;
  • 使用 maven-jar-plugin 和 maven-dependency-plugin 插件;

以下分别进行详细的说明。

二、mvn package#

不在 POM 中配置任何插件,直接使用 mvn package 进行项目打包,这对于没有使用外部依赖包的项目是可行的。但如果项目中使用了第三方 JAR 包,就会出现问题,因为 mvn package 打的 JAR 包中是不含有依赖包,会导致作业运行时出现找不到第三方依赖的异常。这种方式局限性比较大,因为实际的项目往往很复杂,通常都会依赖第三方 JAR。

大数据框架的开发者也考虑到这个问题,所以基本所有的框架都支持在提交作业时使用 --jars 指定第三方依赖包,但是这种方式的问题同样很明显,就是你必须保持生产环境与开发环境中的所有 JAR 包版本一致,这是有维护成本的。

基于上面这些原因,最简单的是采用 All In One 的打包方式,把所有依赖都打包到一个 JAR 文件中,此时对环境的依赖性最小。要实现这个目的,可以使用 Maven 提供的 maven-assembly-plugin 或 maven-shade-plugin 插件。

三、maven-assembly-plugin插件#

Assembly 插件支持将项目的所有依赖、文件都打包到同一个输出文件中。目前支持输出以下文件类型:

  • zip
  • tar
  • tar.gz (or tgz)
  • tar.bz2 (or tbz2)
  • tar.snappy
  • tar.xz (or txz)
  • jar
  • dir
  • war

3.1 基本使用#

在 POM.xml 中引入插件,指定打包格式的配置文件 assembly.xml(名称可自定义),并指定作业的主入口类:

Copy
<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptors> <descriptor>src/main/resources/assembly.xml</descriptor> </descriptors> <archive> <manifest> <mainClass>com.heibaiying.wordcount.ClusterWordCountApp</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>

assembly.xml 文件内容如下:

Copy
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"> <id>jar-with-dependencies</id> <!--指明打包方式-->