springboot maven 打包方式

本文介绍了在使用SpringBoot进行Maven打包时,如何解决因JDK版本不匹配导致的编译错误,以及如何通过配置maven-jar-plugin和dependency-plugin来实现jar包瘦身,包括分离依赖、资源和主清单的处理。

1、全量打包

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>

                <!--需注意使用JDK版本号,否则会报版本编译错误 -->
                <version>2.7.17</version>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
                <!--idea打jar包,提示 jar包中没有主清单属性 - 解决办法  <goal>repackage</goal>起了作用,内容如下:-->
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

版本不对导致错误信息:

org/springframework/boot/maven/RepackageMojo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0 

解决办法:将spring-boot-maven-plugin版本调整对JDK对应的版本即可

对应表:

52 = Java 8

53 = Java 9

54 = Java 10

55 = Java 11

56 = Java 12

57 = Java 13

58 = Java 14

2、瘦身打包:将jar包与lib 依赖和resource 配置文件分离

更新时,只需更新jar即可


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <!-- 排除配置文件 -->
                    <excludes>
                        <exclude>*.properties</exclude>
                        <exclude>*.yml</exclude>
                        <exclude>*/*.properties</exclude>
                        <exclude>*/*.yml</exclude>                         
                    </excludes>
                    <archive>
                        <manifest>
                            <!-- 是否要把第三方jar加入到类构建路径 -->
                            <addClasspath>true</addClasspath>
                            <!--  依赖jar包的位置 -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!--指定main主程序入口-->
                            <mainClass>com.zz.MainApplication</mainClass>
                        </manifest>
                        <manifestEntries>
                            <!--MANIFEST.MF 中 Class-Path 加入自定义路径,多个路径用空格隔开, 加入resource资源访问路径-->
                            <!-- resources文件夹的内容,需要maven-resources-plugin插件补充上-->
                            <Class-Path>./resources/</Class-Path>
                            <!--引入第三方包,加入lib/XXX-1.0.jar lib/YY-1.0.jar 注意需要有空格,
                            如果不想这样加入第三方包的引用,就直接将第三方包打包到本地仓库,然后dependency依赖 -->
                            <!-- <Class-Path>./resources/lib/XXX-1.0.jar lib/YY-1.0.jar</Class-Path> -->
                        </manifestEntries>
                    </archive>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- 拷贝依赖包到lib/目录下 -->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <!-- 复制配置文件到resources -->
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                    
                                </resource>
                            </resources>
                            <outputDirectory>${project.build.directory}/resources/</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

在使用 Maven 打包 Spring Boot 项目时,如果没有生成 `target` 目录及对应的 `.jar` 包,可能是由于以下几个原因导致的: ### 1. 检查项目的打包类型 确保项目的 `<packaging>` 类型为 `jar` 或 `war`。如果设置为 `pom`,Maven 不会执行编译和打包操作,因此不会生成 `target` 目录 [^3]。 ```xml <packaging>jar</packaging> ``` 如果是子模块项目,确保父工程的 `pom.xml` 中没有将 `<packaging>` 设置为 `jar`,而应保持为 `pom`。 --- ### 2. 插件配置问题 确保 `spring-boot-maven-plugin` 已正确配置,并且位于 `pom.xml` 的 `<build>` 部分中。该插件负责打包可执行的 JAR 文件 [^2]。 ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` 如果插件未正确配置,可能导致无法生成最终的 `.jar` 文件或 `target` 目录。 --- ### 3. Maven 生命周期执行顺序 确保执行了正确的 Maven 命令来触发打包过程。推荐使用以下命令进行清理和打包: ```bash mvn clean package ``` 如果仅执行 `mvn package` 而没有清理,某些情况下可能不会重新生成 `target` 目录。此外,如果项目结构复杂,建议检查多模块项目的依赖关系是否正确解析。 --- ### 4. 多模块项目中的依赖冲突 在多模块项目中,例如一个 `parent` 工程包含多个子模块(如 `base`, `moduleA`, `moduleB`),需要确保 `spring-boot-maven-plugin` 仅在实际需要打包的子模块中使用默认配置,而不是在父工程或被其他模块依赖的模块中使用 [^1]。 错误地在 `base` 模块中启用 `spring-boot-maven-plugin` 可能会导致其生成的 JAR 是不可执行的,进而影响 `moduleA` 在构建过程中找不到相关类。 解决方案是仅在主应用模块(如 `moduleA`)中配置 `spring-boot-maven-plugin`,而在其他模块中避免使用它。 --- ### 5. Maven 缓存或本地仓库问题 有时,Maven 的本地缓存可能会导致构建失败。可以尝试清除本地 Maven 仓库中对应项目的缓存文件,或者使用 `-U` 参数强制更新依赖: ```bash mvn clean package -U ``` --- ### 6. 检查 Java 版本兼容性 Spring Boot 对 Java 版本有一定要求,确保使用的 JDK 版本与 Spring Boot 版本兼容。例如,Spring Boot 2.x 推荐使用 Java 8 或 Java 11,而 Spring Boot 3.x 则要求 Java 17 或更高版本。 --- ### 7. 查看详细的构建日志 如果以上方法都无法解决问题,可以通过增加 Maven 输出日志级别来排查具体错误: ```bash mvn clean package -X ``` 该命令会输出详细的调试信息,有助于定位构建失败的具体原因。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值