Maven打包SpringBoot项目,排除第三方依赖包

本文介绍了如何通过Maven配置,在打包Spring Boot项目时排除第三方依赖,将依赖jar移至指定目录,从而实现仅上传自身代码的jar,降低部署文件大小,提升部署速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景

Spring Boot 项目一般会依赖较多的包括 Spring 在内的第三方 jar 包,直接打可运行 jar 包,文件大小往往会达到100M甚至更大;

一个包含数个业务模块的微服务项目,全部可运行的 jar 包加起来总共可达数百M甚至上G;

我们在重复部署测试或者生产环境的时候,每次都要上传包含所有依赖 jar 包的可运行 jar 文件,效率比较低;

期望目标

下面是经过验证的 maven 配置,Spring Boot 项目打包时,只包含我们自己的开发的代码内容,大小仅仅之后数百 kb,所依赖的第三方 jar 则复制到指定的目录下;

这样我们可以只需要上传一次第三方 jar,每次修改代码重新部署时,只上传仅包含我们开发代码的 jar 文件,大大提高了部署效率。

解决方法

maven 的 pom 配置如下,${} 变量根据自己的项目进行替换,第三方 jar 指定到 target/lib 目录下:

<plugins>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <!-- 跳过单元测试 -->
            <skipTests>true</skipTests>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <!-- 复制第三方 jar 到项目目录下的 target/lib/ 下 -->
            <execution>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    <excludeScope>provided</excludeScope>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <!-- 指定 Spring Boot 启动类,实际测试中必须 -->
                    <mainClass>${project.main.class}</mainClass>
                    <!-- 将所有第三方 jar 添加到项目 jar 的 MANIFEST.MF 文件中,这样运行 jar 时依赖包才能被加载 -->
                    <addClasspath>true</addClasspath>
                    <!-- 指定复制第三方 jar 的目标目录为 target/lib/-->
                    <classpathPrefix>./lib/</classpathPrefix>
                </manifest>
            </archive>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <!-- repackage 时排除掉 第三方依赖 jar 文件,我们的可运行 Spring Boot 的 jar 文件瞬间变小 ^_^ -->
        <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <includes>
                <include>
                    <groupId>nothing</groupId>
                    <artifactId>nothing</artifactId>
                </include>
            </includes>
        </configuration>
    </plugin>
</plugins>
<think>我们正在处理一个关于如何移除Spring Boot项目中未使用的Maven依赖的问题。用户希望清理项目,移除那些不再使用的依赖,以保持项目的轻量级和减少潜在冲突。 步骤: 1. 使用Maven插件来识别未使用的依赖。 2. 手动检查并移除这些依赖。 3. 确保在移除后项目能够正常构建和运行。 推荐使用`maven-dependency-plugin`中的`analyze`目标来分析未使用的依赖。 具体步骤: a. 在项目根目录下运行命令:`mvn dependency:analyze` b. 该命令会生成报告,其中会列出未使用的依赖(注意:该工具可能会误报,因为有些依赖可能在运行时才被使用,或者通过反射等方式使用,因此需要谨慎)。 c. 根据报告,在`pom.xml`中移除那些确实未使用的依赖。 另外,也可以使用第三方工具,如`Undeploy`或`Dependency Analytics`等,但Maven插件是标准且直接的方式。 注意事项: - 对于Spring Boot项目,注意有些依赖是Spring Boot starter的传递依赖,可能不是直接显式使用,但可能是必要的。 - 测试依赖(在`test`范围内)不会被该工具标记为未使用,因为它们是用于测试的。 如果使用`mvn dependency:analyze`命令,它会输出两个主要部分: - Used undeclared dependencies: 项目中使用但没有在pom.xml中声明的依赖(可能是传递依赖) - Unused declared dependencies: 在pom.xml中声明了但在代码中未使用的依赖 我们关注的是“Unused declared dependencies”。但请注意,有些依赖可能是运行时必需的(比如通过Spring的自动配置),所以移除后需要运行测试以确保功能正常。 此外,对于Spring Boot项目,可以使用Spring Boot Maven插件来打包,然后检查打包后的jar包中是否包含该依赖的类,但这种方法比较繁琐。 因此,推荐步骤: 1. 运行`mvn clean install`确保项目正常构建。 2. 运行`mvn dependency:analyze`,查看未使用的依赖列表。 3. 逐个移除未使用的依赖(每次移除一个或几个),然后重新构建并运行测试。 4. 确保应用程序运行正常(包括启动和功能测试)。 如果项目使用了Spring Boot的自动配置,有些依赖即使没有在代码中显式使用,也是必需的。例如,如果你在pom.xml中声明了`spring-boot-starter-data-jpa`,但代码中并没有直接使用JPA的类,这是因为Spring Boot在启动时会自动配置,所以这个依赖是必需的。因此,在移除依赖时要特别小心。 另一种方法是使用IDE(如IntelliJ IDEA)的依赖分析功能。IntelliJ IDEA可以分析每个依赖的使用情况,并标记未使用的依赖。 在IntelliJ IDEA中: - 打开pom.xml文件,在编辑器右上角会有一个“依赖关系图”的图标,点击后可以查看依赖关系。 - 或者,右键点击项目 -> Analyze -> Analyze Dependencies。然后可以查看依赖的使用情况。 但是,IDE的分析也可能有误,所以同样需要谨慎。 总结:最可靠的方法是结合Maven插件和手动检查,并在移除后运行全面的测试。 生成相关问题: 1. 如何避免Maven项目中引入不必要的依赖? 2. 如何管理Spring Boot项目的依赖版本? 3. 如何排除Spring Boot starter中的传递依赖?</think>### 如何移除 Spring Boot 项目中未使用的 Maven 依赖 #### 方法 1:使用 Maven Dependency 插件(推荐) 1. **添加插件配置** 在 `pom.xml` 的 `<build>` 部分添加: ```xml <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.1</version> <executions> <execution> <id>analyze</id> <goals><goal>analyze</goal></goals> <configuration> <failOnWarning>false</failOnWarning> <outputXML>true</outputXML> </configuration> </execution> </executions> </plugin> </plugins> ``` 2. **运行分析命令** 在终端执行: ```bash mvn dependency:analyze ``` - 报告路径:`target/dependency-analysis-report.xml` - **关键部分**:查找 `<unusedDeclaredDependencies>` 列表 3. **手动移除依赖** 根据报告结果,从 `pom.xml` 中删除对应的 `<dependency>` 条目 #### 方法 2:使用 IDE 辅助工具 - **IntelliJ IDEA**: 右键点击 `pom.xml` → **Analyze Dependencies** → 查看 "Unused declared dependencies" - **Eclipse**: 安装 **M2e** 插件 → 右键项目 → **Maven** → **Analyze Dependencies** #### 方法 3:第三方工具 - **Undeploy Maven 插件**: ```bash mvn com.github.ferstl:undeploy-maven-plugin:1.0.4:undeploy ``` - **Dependency-Check**: ```bash mvn org.owasp:dependency-check-maven:8.2.1:aggregate ``` #### ⚠️ 注意事项 1. **假阳性处理**: - 反射加载的类(如 Spring Boot 自动配置)可能被误判 - 运行时依赖(如数据库驱动)需手动验证 2. **验证步骤**: ```bash mvn clean package # 构建验证 java -jar target/*.jar # 启动验证 ``` 3. **多模块项目**: 需在每个子模块单独执行分析 > **最佳实践**:建议结合 `mvn dependency:tree` 检查依赖传递关系[^1],移除依赖后务必运行完整测试套件。 --- ### 相关问题 1. 如何排除 Spring Boot Starter 中的传递依赖? 2. Maven 依赖范围(scope)如何影响打包结果? 3. 如何检测并解决 Maven 依赖冲突? [^1]: Maven Dependency Plugin 官方文档:https://maven.apache.org/plugins/maven-dependency-plugin/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值