maven打包成minijar

Posted by hcy on March 21, 2020

本文演示使用mavenmaven-shade-plugin插件实现打包成minijar功能,并解决缺少依赖问题。

maven打包成可执行jar包时需要将依赖的jar包也一同打包到jar包内,最终可能导致得到的可执行jar体积太大,

但是第三方jar的部分class可能是从未使用到的,即使移除也不会影响程序运行,这样可以大大减少打包的体积。

插件maven-shade-plugin为我们提供了这样的功能,他会自动分析jar包内的依赖,将不需要的class移除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <plugin>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
            <minimizeJar>true</minimizeJar>
        </configuration>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

上面配置插件,并挂钩到package步骤中,执行shade。配置minimizeJartrue即可。

部分依赖问题

上面很简单能实现minijar,但是插件在分析依赖时不能分析到反射获取的类,这会导致程序运行时反射获取类失败,所以需要手动处理这样的类。

下面我们在使用logback时,因为配置是写在配置文件里的,所以部分类会被插件丢弃掉导致class Not Find

可以配置filter节点手动包含类,规则是。

1
2
3
4
5
6
    <filter>
        <artifact>artifactId:artifactId</artifact>
            <includes>
                <include>**</include>
           </includes>
    </filter>

示例,包含logback-core的所有类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    <plugin>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
            <minimizeJar>true</minimizeJar>
            <filters>
                <filter>
                    <artifact>ch.qos.logback:logback-core</artifact>
                    <includes>
                        <include>**</include>
                    </includes>
                </filter>
            </filters>
        </configuration>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

​ 要注意的一点是,如果配置了filter,该artifact就不会自动处理依赖了,插件只包含include内手动指定的类,没指定的全部不会包含。我这里使用了** 表示全部包含进来。


转载请注明出处:https://www.huangchaoyu.com/2020/03/21/maven打包成minijar/