### 打成 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 范围给取消了。**
SpringBoot打war包
最新推荐文章于 2024-08-23 10:28:52 发布