Springboot项目瘦身之如何将jar包与lib依赖分开打包

 更新时间:2025年04月30日 10:18:25   作者:William-Yu  
这篇文章主要介绍了Springboot项目瘦身之如何将jar包与lib依赖分开打包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

将jar包与lib依赖分开打包

方法一:项目和依赖完全分离

maven-jar-plugin 负责生成 jar 文件(jar文件中不包含如何依赖),并为 jar 文件的 manifest.mf 文件配置相关内容;maven-dependency-plugin 插件用于在构建时将项目的运行时依赖项复制到指定目录。

部署项目时,生产的jar文件要和lib依赖包在同一目录下。

<build>
        <!-- 生成的jar名称 -->
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <!-- 生成的jar中不要包含pom.xml和pom.properties这两个文件 -->
                        <addMavenDescriptor>false</addMavenDescriptor>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <!--这里需要修改为你的项目的主启动类-->
                            <mainClass>你的启动类路径</mainClass>
                            <!-- 是否使用唯一版本号,控制 MANIFEST.MF 中类路径的版本格式;如果不加,可能会出现依赖后面加时间戳-->
                            <useUniqueVersions>false</useUniqueVersions>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            <!--拷贝依赖的jar外面的lib目录-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-lib</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- 指定依赖拷贝的输出目录 -->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!-- 不排除传递性依赖 -->
                            <excludeTransitive>false</excludeTransitive>
                            <!-- 不移除依赖版本号 -->
                            <stripVersion>false</stripVersion>
                            <!-- 仅包含 runtime 范围的依赖 -->
                            <includeScope>runtime</includeScope>
                            <!-- 排除 common 和 coo 依赖 -->
                            <excludeArtifactIds>common,coo</excludeArtifactIds>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

方法二:部分依赖打入jar文件

  • maven-jar-plugin 插件用于生成主 JAR 文件,并配置 MANIFEST.MF 文件中的相关信息;
  • maven-shade-plugin 插件用于将一些特定的依赖项(例如 common 和 coo)打包到主 JAR 文件中,通常用于创建一个"uber JAR"(即包含所有依赖的 JAR);
  • maven-dependency-plugin 插件用于在构建过程中将除指定依赖(如 common 和 coo)外的其他所有运行时依赖复制到 lib/ 目录;

因为maven-jar-plugin会生成一个无依赖的jar文件,所以不需要的情况下可以删除掉,maven-antrun-plugin 插件用于执行一些额外的任务,比如删除不需要的 JAR 文件。

部署项目时,生产的jar文件要和lib依赖包在同一目录下。

<build>
        <plugins>
            <!-- maven-jar-plugin 用于生成主 JAR 文件,并配置 MANIFEST.MF 文件指定lib文件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <archive>
                        <!-- 包中包含 Maven 描述符(如 pom.xml 和 pom.properties 文件) -->
                        <addMavenDescriptor>true</addMavenDescriptor>
                        <manifest>
                            <!-- 在 MANIFEST.MF 中添加类路径 -->
                            <addClasspath>true</addClasspath>
                            <!-- 指定依赖的类路径前缀为 lib/ -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!-- 指定主启动类 -->
                            <mainClass>你的启动类路径</mainClass>
                            <!-- 使用非唯一版本(不在依赖路径中添加版本号) -->
                            <useUniqueVersions>false</useUniqueVersions>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            <!-- maven-shade-plugin 用于将指定依赖(如 common 和 coo)打包进主 JAR -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <!-- 在 package 阶段执行 -->
                        <phase>package</phase>
                        <goals>
                            <!-- 使用 shade 目标 -->
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <!-- 指定需要包含在主 JAR 中的依赖 -->
                                <includes>
                                    <include>com.test:common</include>
                                    <include>com.test:coo</include>
                                </includes>
                            </artifactSet>
                            <!-- 禁用生成附加的 original-xxx.jar 文件 -->
                            <shadedArtifactAttached>false</shadedArtifactAttached>
                            <!-- 禁用生成 dependency-reduced-pom.xml 文件 -->
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                            <!-- 自定义最终生成的 JAR 包名称 -->
                            <finalName>${project.artifactId}</finalName>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <!-- maven-dependency-plugin 用于将除 common 和 coo 外的其他依赖拷贝到 lib 文件夹 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <!-- 设置执行的 ID -->
                        <id>copy-lib</id>
                        <!-- 在 package 阶段执行 -->
                        <phase>package</phase>
                        <goals>
                            <!-- 使用 copy-dependencies 目标 -->
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- 指定依赖拷贝的输出目录 -->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!-- 不排除传递性依赖 -->
                            <excludeTransitive>false</excludeTransitive>
                            <!-- 不移除依赖版本号 -->
                            <stripVersion>false</stripVersion>
                            <!-- 仅包含 runtime 范围的依赖 -->
                            <includeScope>runtime</includeScope>
                            <!-- 排除 common 和 coo 依赖 -->
                            <excludeArtifactIds>common,coo</excludeArtifactIds>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <!-- maven-antrun-plugin 用于删除多余的 JAR 文件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <!-- 在 package 阶段执行 -->
                        <phase>package</phase>
                        <configuration>
                            <tasks>
                                <!-- 删除由 maven-jar-plugin 生成的默认 JAR 文件 -->
                                <delete file="${project.build.directory}/${project.artifactId}-${project.version}.jar" />
                            </tasks>
                        </configuration>
                        <goals>
                            <!-- 使用 run 目标 -->
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

jar文件和lib打包命令

maven-assembly-plugin 配置是用于 Maven 项目的构建过程,生成一个压缩包(tar 或 zip 格式)并将其输出到指定的目录

			<!--maven-assembly-plugin 用于打包项目生成压缩文件-->
            <plugin>
                <!-- 指定使用的插件:maven-assembly-plugin -->
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <!-- 是否将assembly的ID添加到生成包的名称中。设为false时,不会在包名中添加ID。 -->
                    <appendAssemblyId>false</appendAssemblyId>

                    <!-- 指定最终生成的tar或zip包的文件名,这里设置为djys-business。 -->
                    <finalName>build-jar</finalName>

                    <!-- 输出目录,生成的tar或zip包会存放在target目录下。 -->
                    <outputDirectory>target/</outputDirectory>

                    <descriptors>
                        <!-- 指定引用的assembly配置文件,这里引用src/main/resources/assembly.xml -->
                        <descriptor>src/main/resources/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <!-- 执行ID,可以任意命名,这里使用make-assembly。 -->
                        <id>make-assembly</id>

                        <!-- 将该插件绑定到package生命周期阶段,当执行mvn package时会调用该插件。 -->
                        <phase>package</phase>

                        <goals>
                            <!-- 设置插件目标,这里使用single目标,它会创建单个压缩包(tar/zip)。 -->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

assembly.xml文件内容

<assembly xmlns="http://maven.apache.org/ASSEMBLY/3.3.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/3.3.0 http://maven.apache.org/xsd/assembly-3.3.0.xsd">

    <id>package</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>
    <fileSets>
<!--        &lt;!&ndash;拷贝application.yml文件到jar包的外部config目录下面&ndash;&gt;-->
<!--        <fileSet>-->
<!--            <directory>${basedir}/src/main/resources</directory>-->
<!--            <includes>-->
<!--                <include>*.yml</include>-->
<!--            </includes>-->
<!--            <filtered>true</filtered>-->
<!--            <outputDirectory>${file.separator}config</outputDirectory>-->
<!--        </fileSet>-->

        <!--拷贝lib包到jar包的外部lib下面-->
        <fileSet>
            <directory>${project.build.directory}/lib</directory>
            <outputDirectory>${file.separator}lib</outputDirectory>
            <!-- 打包需要包含的文件 -->
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>

        <!--如有需要,可以配置多个需要拷贝的文件即可-->
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>${file.separator}</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中如何避免sql注入实例详解

    Java中如何避免sql注入实例详解

    SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面这篇文章主要给大家介绍了关于Java中如何避免sql注入的相关资料,需要的朋友可以参考下
    2022-01-01
  • JAVA递归与非递归实现斐波那契数列

    JAVA递归与非递归实现斐波那契数列

    这篇文章主要为大家详细介绍了JAVA递归与非递归实现斐波那契数列,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • spring boot启动时加载外部配置文件的方法

    spring boot启动时加载外部配置文件的方法

    这篇文章主要给大家介绍了关于spring boot启动时加载外部配置文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-02-02
  • Spring Boot的单例模式实现代码

    Spring Boot的单例模式实现代码

    Spring Boot里的单例不是GoF意义上的全JVM 唯一对象 + 私有构造器,而是由 Spring 容器管理的每个 ApplicationContext 仅一个实例,本文介绍Spring Boot的单例模式是如何实现的,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • 实现一个基于Servlet的hello world程序详解步骤

    实现一个基于Servlet的hello world程序详解步骤

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层
    2022-02-02
  • SpringBoot配置MongoDB多数据源的方法步骤

    SpringBoot配置MongoDB多数据源的方法步骤

    这篇文章主要介绍了SpringBoot配置MongoDB多数据源的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 详解Java字符型常量和字符串常量的区别

    详解Java字符型常量和字符串常量的区别

    Java 中的字符型常量和字符串常量是两种不同的数据类型,本文将给大家详细介绍一下Java字符型常量和字符串常量的区别,文中通过代码讲解的非常详细,需要的朋友可以参考下
    2023-10-10
  • Java如何利用POI读取Excel行数

    Java如何利用POI读取Excel行数

    这篇文章主要介绍了java如何利用POI读取Excel行数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • SpringBoot项目中读取resource目录下的文件六种方法

    SpringBoot项目中读取resource目录下的文件六种方法

    这篇文章给大家总结了SpringBoot项目中读取resource目录下的文件六种方法,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2024-05-05
  • Java 并发编程创建线程的四种方式示例详解

    Java 并发编程创建线程的四种方式示例详解

    本文对比Java创建线程的四种方式:继承Thread类(单继承限制)、实现Runnable接口(灵活推荐)、实现Callable接口(支持返回值)、使用线程池(最佳实践,资源管理高效),推荐优先使用线程池提升系统稳定性与资源利用率,感兴趣的朋友一起看看吧
    2025-09-09

最新评论