SpringBoot打war包

### 打成 war 的方法

将 SpringBoot 打成 war ,然后运行在外部的 tomcat 上。

1、因为使用 war 包就无法想 jar 包那样通过 main 方法启动项目了。

所以我们需要添加一个入口函数。


```java
public class RbacaServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // RbacDemoApplication 是启动类
        return builder.sources(RbacDemoApplication.class);
    }
}
```



2、将 pom 文件中的打包方式改成 war。 <packaging>war</packaging>



3、将 spring-boot-starter-tomcat 这个依赖设置成  <scope>provided</scope> ,让 war 包在启动的时候,不要使用内置的 tomcat。



以上三部就可以将项目打成 war 包了。



### 进阶做法

假如我们既要支持 jar 包,又要支持 war 的形式,我们可以适当调整一下 pom。

1、打包的格式使用变量 <packaging>${project.packaging}</packaging>。



2、利用maven的profiles可以灵活打 jar 包或 war 包。使用不同的命令,打成不同的包。

在打不同包的时候,我们还可以添加依赖。比如将 spring-boot-starter-tomcat 设置成 provided 范围。

```xml
 <!--  利用maven的profiles可以灵活打jar包或war包  -->
    <profiles>
        <profile>
            <!--  mvn clean package -Pjar  -->
            <id>jar</id>
            <!-- 激活这个profile为默认profile ,即默认clean package 打jar包    -->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <project.packaging>jar</project.packaging>
            </properties>
        </profile>

        <profile>
            <!--  mvn clean package -Pwar  -->
            <id>war</id>
            <properties>
                <project.packaging>war</project.packaging>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-undertow</artifactId>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>3.1.0</version>
                        <configuration>
                            <failOnMissingWebXml>false</failOnMissingWebXml>
                            <warName>${project.artifactId}</warName>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

```

 



### 注意事项

上面两个都能满足我的需求了。但是将 SpringBoot 项目打成 war 包启动的时候却报错了,jar 包的形式没有报错。

后面根据问题一步步的定位,最终发现是启动的时候缺少了一个类。因为我的依赖中有一个为 provided,所以在打成 war 包的时候,这个依赖不会被打入进去,所以才会报错。



那么为什么我的本地启动不会报错,还有打成 jar 包运行也不会报错呢?

1、本地启动不会报错的原因,大概率是因为使用 idea 来启动的项目,在 idea 中可以设置启动时包含 provided 范围的依赖,所以才不会报错。

2、而对于打成 jar 包形式为什么可以启动,是因为 spring-boot-maven-plugin 打包插件会将 provided 的依赖也打进来。所以 jar 包也可以运行。



**所以我的建议是,如果有这种情况的依赖,直接取消或者你可以使用进阶的办法,在打成 war 包时,将这些依赖的 provided 范围给取消了。**

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值