打包成war整体思路就是排查web容器依赖,添加maven-war-plugin插件。接下来就使用Tomcat容器给大家做个示范,亲测有效。
在讲解下说明一下环境,避免因为环境的问题,给大家带来不必要的烦恼:
(1)操作系统:Win10
(2)IDE:IntelliJ IDEA 2021.3.2
(3)JDK版本:1.8
(4)Spring Boot版本:2.7.6
(5)Tomcat版本:apache-tomcat-9.0.40
在项目的pom.xml文件, 将项目打包方式设置成war,
war
如下图:
我们现在是需要把项目打包成war包了,那么打包的时候就不需要内嵌web容器了,需要排除掉。排除掉内嵌web容器只需要修改pom.xml文件的spring-boot-starter-web依赖,添加如下exclusions属性即可:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
exclusion>
exclusions>
dependency>
上面把tomcat容器依赖排除了, 这里为什么又要引入tomcat容器呢?
因为打包成war包是要让项目在外部tomcat容器中可以运行,但是我们在开发调试的时候还是需要使用到tomcat容器的, 这里引入主要为了方便我们开发调试,所以需要设置以来范围为provided, 如下:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
<scope>providedscope>
dependency>
在标签对中的 -标签对中新增标签对, 引入maven-war-plugin插件:
<build>
<finalName>seckill-redisfinalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.3.2version>
<configuration>
<failOnMissingWebXml>falsefailOnMissingWebXml>
configuration>
plugin>
plugins>
build>
在build下设置项目最终打包的项目名称,如果不设置也是可以的, 默认显示的就是是项目name加上版本号
<build>
<finalName>seckill-redisfinalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.3.2version>
<configuration>
<failOnMissingWebXml>falsefailOnMissingWebXml>
configuration>
plugin>
plugins>
build>
主要修改的内容包括:
(1)启动类继承SpringBootServletInitializer
(2)重写configure方法
package com.kkarma;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class SeckillRedisApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SeckillRedisApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(SeckillRedisApplication.class, args);
}
}
我这里设置的springboot项目的运行端口是8080,所以我这里的访问地址就是:
POST
http://localhost:8080/seckill-redis/seckill/ready
OK,项目中的接口可以正常访问, 项目打包并部署成功。
引入外部jar成功,在自己的项目中如果使用了外部jar的方法修改了项目代码,需要重新进行打包部署。
这里还是使用SpringBoot项目如何引入外部jar及将外部jar打包到项目发布jar包中相同的示例,引入guava-31.1-jre.jar包来实现一个简单接口来进行演示
个外部的jar包, 我这里使用的是guava-31.1-jre.jar作为演示
下载地址:https://repo1.maven.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar
在项目根路径下创建一个文件夹libs,将guava-31.1-jre.jar放到libs下。
<dependency>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
<version>31.1-jreversion>
<scope>systemscope>
<systemPath>${project.basedir}/libs/guava-31.1-jre.jarsystemPath>
dependency>
<build>
<finalName>seckill-redisfinalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.3.2version>
<configuration>
<failOnMissingWebXml>falsefailOnMissingWebXml>
<webResources>
<webResource>
<directory>${pom.basedir}/libs/directory>
<targetPath>WEB-INF/lib/targetPath>
<includes>
<include>**/*.jarinclude>
includes>
webResource>
webResources>
configuration>
plugin>
plugins>
build>
package com.kkarma.controller;
import com.google.common.collect.Lists;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/app")
public class AppController {
@GetMapping("")
public Map<String, Object> index() {
Map<String, Object> map = new HashMap<>();
List<String> list = Lists.newArrayList("zhangsan", "lisi", "wangwu");
map.put("code", 200);
map.put("msg", "操作成功");
map.put("data", list);
return map;
}
}
重新打包之后发现我们引入的外部jar包成功被打包到项目的 WEB-INF目录下的lib目录下面
重新将war包部署到tomcat的webapp目录下
重启tomcat容器后再进行测试
访问接口测试:
GET
http://localhost:8080/seckill-redis/app
OK,项目中的接口可以正常访问, 引入外部jar包之后,项目打包并部署依然是成功的。
注意,不能右键启动类ExampleApplication,执行启动。这里需要选择我们的tomcat Server启动
项目成功部署到tomcat并启动
访问引入了外部jar包的接口进行测试验证
OK,项目打成war包,运行访问仍然正常。
三、外部引入的jar无法访问
解决方案
创建目录src/main/webapp/WEB-INF/lib/,将外置的jar放到这个目录下。
当然其它有引用的地方也需要相应修改下路径,修改maven-war-plugin的路径:
<build>
<finalName>seckill-redisfinalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.3.2version>
<configuration>
<failOnMissingWebXml>falsefailOnMissingWebXml>
<webResources>
<webResource>
<directory>${pom.basedir}/src/main/webapp/WEB-INF/lib/directory>
<targetPath>WEB-INF/lib/targetPath>
<includes>
<include>**/*.jarinclude>
includes>
webResource>
webResources>
configuration>
plugin>
plugins>
build>
通常情况下这样修改配置之后就可以正常的使用了,如果还不行的话,那么就再添加一个maven-compiler-plugin插件:
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>${java.version}source>
<target>${java.version}target>
<encoding>utf8encoding>
<compilerArguments>
<extdirs>${project.basedir}/src/main/webapp/WEB-INF/libextdirs>
compilerArguments>
configuration>
plugin>
如果这样还是不行的话, 哈哈, 自行百度吧, 因为你遇到的问题我也没遇到过啦~