maven工程jar包瘦身

Posted 虚惊一百场

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了maven工程jar包瘦身相关的知识,希望对你有一定的参考价值。

随着微服务架构思想的普及,很多公司或者独立开发人都倾向于将自己的项目模块化;这样极大的方便 了开发以及运维成本。当模块化后,工程中所依赖的第三方包就需要单独存放到一个公共的lib库,避免依赖的重复。

以spring cloud工程为例

每个独立的模块pom文件中,加入maven插件maven-jar-pluginmaven-dependency-plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.jason.HelloApplication</mainClass>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.2</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这样打出来的包就会将当前模块所依赖的第三方包放在lib文件夹下,不会将其打入到工程模块中,有效的减少了模块的体积。

当然,项目中可能会出现maven仓库中不存在的依赖或者我们自定义出来的依赖,这个jar文件需要放在在项目路径下的lib中。我们就需要通过声明路径的方式引入,

         <dependency>
            <groupId>com.jason</groupId>
            <artifactId>security</artifactId>
            <version>${security.version}</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/security-${security.version}.jar</systemPath>
        </dependency>

这种通过路径引入的包,在打包时还需要额外将路径信息写入到MANIFEST.MF中,那么我们的maven-jar-plugin配置中还需要加一点东西

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.jason.HelloApplication</mainClass>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                    </manifest>
                    <manifestEntries>
                        <!--MANIFEST.MF 中 Class-Path 加入资源文件目录-->
                        <Class-Path>lib/security-${security.version}.jar ./resources/${project.artifactId}/</Class-Path>
                        </manifestEntries>
                </archive>
            </configuration>
        </plugin>

这样就能将加入的jar包写入到引用路径中。

除了maven-jar-plugin这个插件之外,还有一个spring-boot-maven-plugin,我理解的是后者是对前者做了进一步的封装。

以上是关于maven工程jar包瘦身的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 部署 Jar 文件,瘦身优化指南 !

SpringBoot Jar包瘦身 - 跟大文件说再见!

Spring Boot部署JAR文件瘦身优化经验分享

瘦身部署应用

maven工程编译并生成可执行JAR包命令

如何把jar包生成maven工程