Maven 打包

Maven 打包

标准JAR和Fat JAR打包

在 Maven 的默认打包方式中,生成的标准 JAR 文件仅包含当前模块编译后的代码(.class文件),不包含任何第三方依赖库。这种 JAR 适合作为普通库被其他项目引用,但由于缺少依赖,无法直接运行,且体积通常较小(KB 级)。而通过 Spring Boot Maven 插件spring-boot-maven-plugin)重新打包生成的 Fat JAR(又称可执行 JAR),则会将模块自身代码、所有依赖的第三方库(打包在BOOT-INF/lib/下,如 Spring 框架、内嵌Web服务器 Tomcat)、以及 Spring Boot 启动器(org.springframework.boot.loader)全部嵌入到单个 JAR 中。这种 Fat JAR 体积较大(MB 级),但能通过 java -jar 直接运行,适合作为独立应用部署。两者本质区别在于:标准 JAR 是“轻量代码包”,需依赖外部环境;而 Fat JAR 是“自带完整运行环境的全家桶”,开箱即用。

Fat JAR打包目录
├─BOOT-INF            // 存放应用程序的代码和依赖库
│  │  
│  ├─classes            // 存放当前项目的编译代码(.class)和资源文件(如 application.yml)
│  └─lib            // 依赖的JAR包
│          
├─META-INF            // 存放元数据信息
│  │  MANIFEST.MF            // 清单文件,定义启动类、类路径等信息
│  │  spring-devtools.properties            // 
│                  
└─org            // 类加载器,负责加载BOOT-INF中的类和依赖
    └─springframework
        └─boot
            └─loader  
pom.xml文件配置
<build>
        <plugins>
             <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.5.15</version>
                <configuration>
                    <fork>true</fork>  <!-- 启用独立进程运行应用,确保devtools热部署生效 -->
                    <!-- 不在生成artifactId.jar.original,而是生成artifactId-exec.jar -->
                    <classifier>exec</classifier> 
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <!-- 重新打包成可执行的Spring Boot JAR (包含内嵌Tomcat和依赖库) -->
                            <goal>repackage</goal>  
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    
        <finalName>${project.artifactId}</finalName>
</build>
posted @ 2025-06-19 09:37  jishaleng  阅读(43)  评论(0)    收藏  举报