Spring Boot既打jar包又打war包如何做

你好,我是柳岸花开。

引言

在软件开发中,根据不同的部署需求,我们可能需要将应用打包成不同的格式。Spring Boot作为目前流行的Java应用开发框架,提供了一种简单的方式来打包应用。本文将介绍如何利用Maven Profiles在Spring Boot项目中灵活地打包成jar包或war包。

Maven Profiles简介

Maven Profiles是Maven提供的一种功能,允许用户根据不同的需求定义不同的构建配置。通过Profiles,我们可以轻松切换构建配置,而无需修改项目本身的配置。

Spring Boot与Maven结合

Spring Boot通过SpringBootServletInitializer类支持传统的Servlet容器部署。结合Maven Profiles,我们可以定义两种不同的打包方式:jar和war。

示例项目配置

以下是示例项目的Maven配置,展示了如何根据不同的Profiles来打包Spring Boot应用。

项目主类
复制代码
public class PlatformLocalApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(PlatformLocalApplication.class);
    }
}

当打包成war包时,此主类是必需的,以便应用可以在传统的Servlet容器中运行。

Maven配置
复制代码
<packaging>${project.package}</packaging>

这里使用了Maven的属性替换功能,根据激活的Profile动态设置打包类型。

Jar Profile配置
复制代码
<profile>
            <!--  mvn clean install -Dmaven.test.skip=true -Pjar  -->
            <id>jar</id>
            <!-- 激活这个profile为默认profile ,即默认clean install打jar包    -->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <project.package>jar</project.package>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </dependency>
            </dependencies>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources</directory>
                        <filtering>true</filtering>
                    </resource>
                </resources>
                <plugins>
                    <plugin>
                        <groupId>com.github.shalousun</groupId>
                        <artifactId>smart-doc-maven-plugin</artifactId>
                    </plugin>
                    <!-- compile plugin -->
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                            <encoding>UTF-8</encoding>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <configuration>
                            <skip>true</skip>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>2.6</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-jar-plugin</artifactId>
                        <configuration>
                            <excludes>
                                <exclude>application.yml</exclude>
                            </excludes>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <version>${springboot.version}</version>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>repackage</goal>
                                </goals>
                                <configuration>
                                    <classifier>exec</classifier>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- 过滤后缀不需要转码的文件后缀名 pdf -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-resources-plugin</artifactId>
                        <configuration>
                            <encoding>UTF-8</encoding>
                            <useDefaultDelimiters>false</useDefaultDelimiters>
                            <nonFilteredFileExtensions>
                                <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
                            </nonFilteredFileExtensions>
                        </configuration>
                    </plugin>
                </plugins>
                <finalName>platform-local</finalName>
            </build>
        </profile>

这个Profile是默认激活的,用于打包成jar格式。

War Profile配置
复制代码
<!--  SpringBoot打war包,需要让主程序类 继承 SpringBootServletInitializer,并重写configure方法    -->
        <profile>
            <!--  mvn clean install -Dmaven.test.skip=true -Pwar  -->
            <id>war</id>
            <properties>
                <project.package>war</project.package>
            </properties>
            <dependencies>
                <!--  打war包要排除内嵌tomcat;并加上javax.servlet包   -->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <exclusions>
                        <exclusion>
                            <artifactId>spring-boot-starter-tomcat</artifactId>
                            <groupId>org.springframework.boot</groupId>
                        </exclusion>
                    </exclusions>
                </dependency>
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>javax.servlet-api</artifactId>
                    <version>3.1.0</version>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>javax.websocket</groupId>
                    <artifactId>javax.websocket-api</artifactId>
                    <version>1.1</version>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources</directory>
                        <filtering>true</filtering>
                    </resource>
                </resources>
                <finalName>platform-local</finalName>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>3.2.0</version>
                    </plugin>
                </plugins>
            </build>
        </profile>

这个Profile用于打包成war格式,需要通过命令行参数-Pwar来激活。

打包命令
  • 打包成jar包:

    复制代码
    mvn clean install -Dmaven.test.skip=true -Pjar
  • 打包成war包:

    复制代码
    mvn clean install -Dmaven.test.skip=true -Pwar
结语

通过Maven Profiles,我们可以非常灵活地控制Spring Boot项目的打包过程。无论是需要快速部署的jar包,还是需要在传统Servlet容器中运行的war包,都可以轻松实现。希望本文能够帮助开发者更好地利用Maven和Spring Boot的强大功能。

👇关注我,下期了解👇

Spring配置类源码深度解析

回复 222,获取Java面试题合集

关于我

一枚爱折腾的Java程序猿,专注Spring干货。把路上的问题记录下来,帮助那些和我一样的人。

好奇心强,喜欢并深入研究古天文。

崇尚 个人系统创建,做一些时间越长越有价值的事情。思考把时间留下来。

本文由mdnice多平台发布

相关推荐
兩尛20 小时前
Spring面试
java·spring·面试
Java中文社群20 小时前
服务器被攻击!原因竟然是他?真没想到...
java·后端
Full Stack Developme20 小时前
java.nio 包详解
java·python·nio
零千叶20 小时前
【面试】Java JVM 调优面试手册
java·开发语言·jvm
代码充电宝20 小时前
LeetCode 算法题【简单】290. 单词规律
java·算法·leetcode·职场和发展·哈希表
li37149089020 小时前
nginx报400bad request 请求头过大异常处理
java·运维·nginx
摇滚侠20 小时前
Spring Boot 项目, idea 控制台日志设置彩色
java·spring boot·intellij-idea
Aevget21 小时前
「Java EE开发指南」用MyEclipse开发的EJB开发工具(二)
java·ide·java-ee·eclipse·myeclipse
黄昏晓x21 小时前
C++----多态
java·jvm·c++
Brookty21 小时前
【算法】前缀和
java·学习·算法·前缀和·动态规划