SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包

1 Springboot项目如何打成war包

1.1 环境准备

打包成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

1.2 创建一个SpringBoot项目

SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第1张图片

1.3 修改pom.xml文件

1.3.1 添加war打包方式

在项目的pom.xml文件, 将项目打包方式设置成war,

war

如下图:

SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第2张图片

1.3.2 排除SpringBoot内置的tomcat

我们现在是需要把项目打包成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>

1.3.3 添加tomcat容器依赖

上面把tomcat容器依赖排除了, 这里为什么又要引入tomcat容器呢?

因为打包成war包是要让项目在外部tomcat容器中可以运行,但是我们在开发调试的时候还是需要使用到tomcat容器的, 这里引入主要为了方便我们开发调试,所以需要设置以来范围为provided, 如下:

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-tomcatartifactId>
            
            <scope>providedscope>
        dependency>

1.3.4 添加war打包插件

在标签对中的 -标签对中新增标签对, 引入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>

1.3.5 设置最终打包项目名

在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.4 修改下项目的启动类

主要修改的内容包括:

  • (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);
    }

}

1.5 使用maven打包

  • (1) mvn clean
    SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第3张图片

  • (2)mvn package
    SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第4张图片

  • (3)获取到打包完成之后的war包
    SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第5张图片

1.6 使用tomcat部署项目

  • (1)把war包放在tomcat的webapps目录下。
    SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第6张图片

  • (2)启动tomcat:bin/startup.bat
    SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第7张图片

  • (3)localhost+tomcat端口号+项目名+接口,进行访问。

我这里设置的springboot项目的运行端口是8080,所以我这里的访问地址就是:
POST
http://localhost:8080/seckill-redis/seckill/ready
SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第8张图片
OK,项目中的接口可以正常访问, 项目打包并部署成功。

2 SpringBoot项目引入外部Jar打包成war包

引入外部jar成功,在自己的项目中如果使用了外部jar的方法修改了项目代码,需要重新进行打包部署。
这里还是使用SpringBoot项目如何引入外部jar及将外部jar打包到项目发布jar包中相同的示例,引入guava-31.1-jre.jar包来实现一个简单接口来进行演示

2.1 在项目中引入guava

个外部的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下。
SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第9张图片

2.2 修改pom.xml文件

2.2.1 引入依赖

        <dependency>
            <groupId>com.google.guavagroupId>
            <artifactId>guavaartifactId>
            <version>31.1-jreversion>
            
            <scope>systemscope>
            <systemPath>${project.basedir}/libs/guava-31.1-jre.jarsystemPath>
        dependency>

2.2.2 修改打包配置

    <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>

2.3 创建一个测试接口,使用到guava中的类

SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第10张图片

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;
    }
}

2.4 重新打包部署测试

重新打包之后发现我们引入的外部jar包成功被打包到项目的 WEB-INF目录下的lib目录下面
SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第11张图片
重新将war包部署到tomcat的webapp目录下
SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第12张图片
重启tomcat容器后再进行测试
SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第13张图片
访问接口测试:
GET
http://localhost:8080/seckill-redis/app

SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第14张图片

OK,项目中的接口可以正常访问, 引入外部jar包之后,项目打包并部署依然是成功的。

3 SpringBoot项目引如何运行在外部tomcat容器

3.1 配置tomcat容器

  • 点击Edit Configurations
    SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第15张图片
  • 点击"+"号, 下拉找到Tomcat Server 选择Local
    SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第16张图片
  • 修改tomcat名称,并配置本地tomcat
    SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第17张图片
  • 配置项目包
    SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第18张图片
  • 自定义Application context(可以不改)
    SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第19张图片
    点击apply和OK,基本配置完成,在Idea的配置可以看到已经配置的Tomcat。

3.2 启动Tomcat测试

注意,不能右键启动类ExampleApplication,执行启动。这里需要选择我们的tomcat Server启动
SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第20张图片
项目成功部署到tomcat并启动
SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第21张图片
访问引入了外部jar包的接口进行测试验证
SpringBoot项目如何引入外部jar及将外部jar打包到项目发布war包_第22张图片

OK,项目打成war包,运行访问仍然正常。

3.3 常见问题及解决方法

三、外部引入的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>

如果这样还是不行的话, 哈哈, 自行百度吧, 因为你遇到的问题我也没遇到过啦~

你可能感兴趣的:(Java,Spring全家桶,SpringBoot,spring,boot,jar,tomcat)