maven-shade-plugin 入门指南

1. Why?

通过 maven-shade-plugin 生成一个 uber-jar,它包含所有的依赖 jar 包。

2. Goals

GoalDescription
shade:helpDisplay help information on maven-shade-plugin.Callmvn shade:help -Ddetail=true -Dgoal=to display parameter details.
shade:shadeMojo that performs shading delegating to the Shader component.

3. Usage

  • 配置 maven-shade-plugin

maven-shade-plugin 将 goal shade:shade 绑定到 phase package 上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <configuration>
               <!-- put your configurations here -->
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                       <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  • 执行命令
1
mvn clean package

会在 target 文件生成一个 uber-jar,以 -shaded.jar 为后缀的 jar 包。

4. Examples

  • Selecting Contents for Uber JAR

将该工程依赖的部分 Jar 包 include/exclude 掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<build>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-shade-plugin</artifactId>
       <version>2.4.3</version>
       <executions>
         <execution>
           <phase>package</phase>
           <goals>
             <goal>shade</goal>
           </goals>
           <configuration>
             <artifactSet>
               <excludes>
                 <exclude>classworlds:classworlds</exclude>
                 <exclude>junit:junit</exclude>
                 <exclude>jmock:*</exclude>
                 <exclude>*:xml-apis</exclude>
                 <exclude>org.apache.maven:lib:tests</exclude>
                 <exclude>log4j:log4j:jar:</exclude>
               </excludes>
             </artifactSet>
           </configuration>
         </execution>
       </executions>
     </plugin>
   </plugins>
</build>

将依赖的某个 Jar 包内部的类或者资源 include/exclude 掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<build>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-shade-plugin</artifactId>
       <version>2.4.3</version>
       <executions>
         <execution>
           <phase>package</phase>
           <goals>
             <goal>shade</goal>
           </goals>
           <configuration>
             <filters>
               <filter>
                 <artifact>junit:junit</artifact>
                 <includes>
                   <include>junit/framework/**</include>
                   <include>org/junit/**</include>
                 </includes>
                 <excludes>
                   <exclude>org/junit/experimental/**</exclude>
                   <exclude>org/junit/runners/**</exclude>
                 </excludes>
               </filter>
               <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>
   </plugins>
</build>

maven-shade-plugin 自动将所有不使用的类全部排除掉,将 uber-jar 最小化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  <build>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-shade-plugin</artifactId>
       <version>2.4.3</version>
       <executions>
         <execution>
           <phase>package</phase>
           <goals>
             <goal>shade</goal>
           </goals>
           <configuration>
             <minimizeJar>true</minimizeJar>
           </configuration>
         </execution>
       </executions>
     </plugin>
   </plugins>
 </build>
  • Attaching the Shaded Artifact

默认会生成一个Jar包和一个以 "-shaded"为结尾的uber-jar包,可以通过配置来指定uber-jar的后缀名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  <build>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-shade-plugin</artifactId>
       <version>2.4.3</version>
       <executions>
         <execution>
           <phase>package</phase>
           <goals>
             <goal>shade</goal>
           </goals>
           <configuration>
             <shadedArtifactAttached>true</shadedArtifactAttached>
             <shadedClassifierName>jackofall</shadedClassifierName> <!-- Any name that makes sense -->
           </configuration>
         </execution>
       </executions>
     </plugin>
   </plugins>
 </build>
  • Executable JAR

通过设置 MainClass 创建一个可执行 Jar 包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  <build>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-shade-plugin</artifactId>
       <version>2.4.3</version>
       <executions>
         <execution>
           <phase>package</phase>
           <goals>
             <goal>shade</goal>
           </goals>
           <configuration>
             <transformers>
               <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                 <mainClass>org.sonatype.haven.HavenCli</mainClass>
               </transformer>
             </transformers>
           </configuration>
         </execution>
       </executions>
     </plugin>
   </plugins>
 </build>
  • Relocating Classes

Java 工程经常会遇到第三方 Jar 包冲突,使用 maven shade plugin 解决 jar 或类的多版本冲突。 maven-shade-plugin 在打包时,可以将项目中依赖的 jar 包中的一些类文件打包到项目构建生成的 jar 包中,在打包的时候把类重命名。下面的配置将 org.codehaus.plexus.util jar 包重命名为 org.shaded.plexus.util。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  <build>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-shade-plugin</artifactId>
       <version>2.4.3</version>
       <executions>
         <execution>
           <phase>package</phase>
           <goals>
             <goal>shade</goal>
           </goals>
           <configuration>
             <relocations>
               <relocation>
                 <pattern>org.codehaus.plexus.util</pattern>
                 <shadedPattern>org.shaded.plexus.util</shadedPattern>
                 <excludes>
                   <exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude>
                   <exclude>org.codehaus.plexus.util.xml.pull.*</exclude>
                 </excludes>
               </relocation>
             </relocations>
           </configuration>
         </execution>
       </executions>
     </plugin>
   </plugins>
 </build>

参考

maven 入门指南 maven 生命周期 Maven 默认插件以及功能 maven 依赖管理 maven-shade-plugin 入门指南 maven-assembly-plugin 入门指南