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

news2024/12/29 1:13:44

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

在这里插入图片描述

1.3 修改pom.xml文件

1.3.1 添加war打包方式

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

<packaging>war</packaging>

如下图:

在这里插入图片描述

1.3.2 排除SpringBoot内置的tomcat

我们现在是需要把项目打包成war包了,那么打包的时候就不需要内嵌web容器了,需要排除掉。排除掉内嵌web容器只需要修改pom.xml文件的spring-boot-starter-web依赖,添加如下exclusions属性即可:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

1.3.3 添加tomcat容器依赖

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!-- 防止部分同学部分同学不明白参数的意义, 这里加些说明
                1.test范围是指测试范围有效,在编译和打包时都不会使用这个依赖
                2.compile范围是指编译范围内有效,在编译和打包时都会将依赖存储进去
                3.provided依赖,在编译和测试过程中有效,最后生成的war包时不会加入 例如:
                    servlet-api,因为servlet-api在tomcat服务器已经存在了,如果再打包会冲突
                4.runtime在运行时候依赖,在编译时候不依赖
                5.system表示此依赖来自于外部jar, 而不是maven仓库
                如果引入依赖未指定,默认依赖范围是compile
            -->
            <scope>provided</scope>
        </dependency>

1.3.4 添加war打包插件

在标签对中的 -标签对中新增标签对, 引入maven-war-plugin插件:

    <build>
        <finalName>seckill-redis</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.2</version>
                <configuration>
                    <!--
                        failOnMissingWebXml设置为false,意思是让系统忽略缺少WEB-INF的错误
                    -->
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>

1.3.5 设置最终打包项目名

在build下设置项目最终打包的项目名称,如果不设置也是可以的, 默认显示的就是是项目name加上版本号

    <build>
        <finalName>seckill-redis</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.2</version>
                <configuration>
                    <!--
                        failOnMissingWebXml设置为false,意思是让系统忽略缺少WEB-INF的错误
                    -->
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </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
    在这里插入图片描述

  • (2)mvn package
    在这里插入图片描述

  • (3)获取到打包完成之后的war包
    在这里插入图片描述

1.6 使用tomcat部署项目

  • (1)把war包放在tomcat的webapps目录下。
    在这里插入图片描述

  • (2)启动tomcat:bin/startup.bat
    在这里插入图片描述

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

我这里设置的springboot项目的运行端口是8080,所以我这里的访问地址就是:
POST
http://localhost:8080/seckill-redis/seckill/ready
在这里插入图片描述
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下。
在这里插入图片描述

2.2 修改pom.xml文件

2.2.1 引入依赖

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
            <!--
                scope=system表示此依赖是来自外部jar,而不是maven仓库
                注意:
                  只有当scope设置为system时,systemPath属性才会生效
                  systemPath是一个物理文件路径,来指定依赖的外部jar在物理磁盘的位置
                  ${project.basedir}代表项目根目录
            -->
            <scope>system</scope>
            <systemPath>${project.basedir}/libs/guava-31.1-jre.jar</systemPath>
        </dependency>

2.2.2 修改打包配置

    <build>
        <finalName>seckill-redis</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.2</version>
                <configuration>
                    <!--
                        failOnMissingWebXml设置为false,意思是让系统忽略缺少WEB-INF的错误
                    -->
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <!--
                        外部jar包打包到当前项目需要增加以下属性配置
                    -->
                    <webResources>
                        <webResource>
                            <directory>${pom.basedir}/libs/</directory>
                            <targetPath>WEB-INF/lib/</targetPath>
                            <includes>
                                <include>**/*.jar</include>
                            </includes>
                        </webResource>
                    </webResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

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

在这里插入图片描述

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目录下面
在这里插入图片描述
重新将war包部署到tomcat的webapp目录下
在这里插入图片描述
重启tomcat容器后再进行测试
在这里插入图片描述
访问接口测试:
GET
http://localhost:8080/seckill-redis/app

在这里插入图片描述

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

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

3.1 配置tomcat容器

  • 点击Edit Configurations
    在这里插入图片描述
  • 点击"+"号, 下拉找到Tomcat Server 选择Local
    在这里插入图片描述
  • 修改tomcat名称,并配置本地tomcat
    在这里插入图片描述
  • 配置项目包
    在这里插入图片描述
  • 自定义Application context(可以不改)
    在这里插入图片描述
    点击apply和OK,基本配置完成,在Idea的配置可以看到已经配置的Tomcat。

3.2 启动Tomcat测试

注意,不能右键启动类ExampleApplication,执行启动。这里需要选择我们的tomcat Server启动
在这里插入图片描述
项目成功部署到tomcat并启动
在这里插入图片描述
访问引入了外部jar包的接口进行测试验证
在这里插入图片描述

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

3.3 常见问题及解决方法

三、外部引入的jar无法访问

解决方案

创建目录src/main/webapp/WEB-INF/lib/,将外置的jar放到这个目录下。

当然其它有引用的地方也需要相应修改下路径,修改maven-war-plugin的路径:

 <build>
     <finalName>seckill-redis</finalName>
     <plugins>
         <plugin>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
             <configuration>
                 <excludes>
                     <exclude>
                         <groupId>org.projectlombok</groupId>
                         <artifactId>lombok</artifactId>
                     </exclude>
                 </excludes>
             </configuration>
         </plugin>

         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-war-plugin</artifactId>
             <version>3.3.2</version>
             <configuration>
                 <!--
                     failOnMissingWebXml设置为false,意思是让系统忽略缺少WEB-INF的错误
                 -->
                 <failOnMissingWebXml>false</failOnMissingWebXml>
                 <!--
                     外部jar包打包到当前项目需要增加以下属性配置
                 -->
                 <webResources>
                     <webResource>
                         <directory>${pom.basedir}/src/main/webapp/WEB-INF/lib/</directory>
                         <targetPath>WEB-INF/lib/</targetPath>
                         <includes>
                             <include>**/*.jar</include>
                         </includes>
                     </webResource>
                 </webResources>
             </configuration>
         </plugin>
     </plugins>
 </build>

通常情况下这样修改配置之后就可以正常的使用了,如果还不行的话,那么就再添加一个maven-compiler-plugin插件:

<!-- 设置javac编译器的版本和编码字符 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
        <encoding>utf8</encoding><!-- 编译器编码 -->
        <compilerArguments>
            <extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
        </compilerArguments>
    </configuration>
</plugin>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计师都在用的5个设计素材库

作为一名设计师推荐几个设计素材网站&#xff0c;建议收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/?vNTYxMjky 站内平面海报、UI设计、电商淘宝、高清图片、样机模板等素材非常齐全。还有在线抠图、CDR版本转换功能&#xff0c;能有效的为设计师节省找素材时…

嵌入式Linux-线程属性

1. 线程的属性 1.1 概念 如前所述&#xff0c;调用 pthread_create()创建线程&#xff0c;可对新建线程的各种属性进行设置。在 Linux 下&#xff0c;使用pthread_attr_t 数据类型定义线程的所有属性。 调用 pthread_create()创建线程时&#xff0c;参数 attr 设置为 NULL&a…

Three.js 初阶入门篇(一)

系列文章目录 文章目录系列文章目录学习背景一、什么是3D&#xff08;直接看作品吧&#xff09;&#xff1f;汽车作品欣赏鼠标可以随意转动角度打开机盖&#xff08;交互效果&#xff09;尾部3D链接&#x1f517;如下&#xff08;链接打开会有一些慢&#xff09;二、如何创建一…

零入门容器云网络实战-7->Mac环境下为虚拟机磁盘空间进行扩容

在Mac环境下&#xff0c;使用PD软件创建的虚拟机磁盘空间不够时&#xff0c;如何扩容呢&#xff1f; 主要分两大步骤&#xff1a; 先通过PD界面&#xff0c;设置增加多少空间进入虚拟机里&#xff0c;通过fdisk等相关命令&#xff0c;使其增加的空间生效 1、第一大步&#xf…

机器学习之线性模型

定义 线性模型非常常见&#xff0c;但详细了解其中原理是必要的。 一般将样本特征进行线性组合达到预测的目标&#xff0c;如表达式yf(X;W)byf(X;W)byf(X;W)b,其中XXX为输入的样本数据&#xff0c;WWW为权重系数&#xff0c;bbb为偏置系数。 如对于图片样本&#xff0c;一种…

兔年春晚一大怪像,影视演员变成了万能,专业歌手却被晾在一边

怪事年年有&#xff0c;今年特别多。谁也没有想到&#xff0c;兔年春节还没有过去&#xff0c;就出现了一种奇怪的现象。中央电视台春晚&#xff0c;曾经执全国春晚之牛耳&#xff0c;然而谁能想到&#xff0c;四十多年后的今天&#xff0c;曾经的扛把子却变成了鸡肋。 今年央视…

【C++初阶】七、STL---vector(总)|vector的介绍|vector的使用

目录 一、vector的介绍 二、vector的使用 2.1 Construct 2.2 operator 2.3 Iterators 2.4 Capacity 2.5 Element access 2.6 Modifiers 一、vector的介绍 前面学习了 string类&#xff0c;所以 vector 的学习成本很低&#xff0c;因为接口都大致相同&#xff0c;功能也…

【促进开发】上海道宁与DHTMLX为您提供易于使用且功能丰富的JavaScript组件

DHTMLX提供 有效且专业设计的 JavaScript/HTML5工具 使开发人员 能够以更少的时间和精力 创建具有丰富界面和快速性能的 复杂Web和移动应用程序 DHTMLX使用 JavaScript UI 库促进开发 易于使用且功能丰富的 JavaScript组件 非常适合您在任何领域和 任何复杂性中的解…

SpringCloud微服务项目实战 - 7.kafka及文章上下架

一步一步地苦熬苦掖&#xff0c;终于我们也看见了花团锦簇&#xff0c;我们也知道了彩灯佳话。那一夜&#xff0c;我也曾梦见百万雄兵。 系列文章目录 项目搭建App登录及网关App文章自媒体平台&#xff08;博主后台&#xff09;内容审核(自动)延迟任务 文章目录系列文章目录一…

并查集应用

一、并查集模板 int find(int x) {if(p[x]!x) p[x]find(p[x]);return p[x]; }并查集高效率的核心是一旦更新过一次后&#xff0c;就会将路径压缩掉&#xff0c;避免后续重复遍历路径。 二、并查集应用 1、格子游戏 分析&#xff1a;每构成一个方框&#xff0c;当最后两个点连…

RA4M2开发(2)----基于IIC驱动OLED

概述 在e2studio中创建新的工程并导入必要的文件&#xff0c;包括I2C驱动代码和SSD1306 OLED显示驱动代码。配置RA4M2的I2C接口&#xff0c;使其作为I2C master进行通信。初始化SSD1306 OLED显示驱动代码&#xff0c;并配置显示屏的物理地址和分辨率。通过I2C驱动代码将数据写…

【Linux】初识环境变量

文章目录环境变量引入初见环境变量和环境变量有关的指令如何通过代码获取环境变量getenv()main函数的命令行参数第三方变量environ程序变量可以继承给子进程环境变量引入 Linux中有各种指令&#xff0c; 每个指令其实都是一个可执行程序&#xff1a; 和我们自己写的C语言代码…

API自动化测试【postman生成报告】

PostMan生成测试报告有两种&#xff1a; 1、控制台的模式 2、HTML的测试报告 使用到一个工具newman Node.js是前端的一个组件&#xff0c;主要可以使用它来开发异步的程序。 一、控制台的模式 1、安装node.js 双击node.js进行安装&#xff0c;安装成功后在控制台输入node…

Ansys Zemax | 多模光纤耦合

本文展示了利用几何图像分析特性来计算多模光纤耦合效率的方法。 还有使用IMAE操作数优化多模光纤耦合效率的方法。该方法只适用于包含大量模式的多模光纤。 下载 联系工作人员获取附件 简介 我们可以使用OpticStudio中的几何图像分析&#xff08;Geometric Image Analysi…

已解决error: legacy-instal1-failure

已解决&#xff08;pip install wxPython安装失败&#xff09;error: legacy-instal1-failure Encountered error while trying to install package.wxPython note: This is an issue with the package mentioned above&#xff0c;not pip. hint : See above for output from …

ChatGPT 回答什么是敏捷测试

Jenkins 官方文档&#xff1a;https://jenkins.io/doc/JUnit 插件文档&#xff1a;JUnit | Jenkins pluginTestNG 插件文档&#xff1a;https://plugins.jenkins.io/testng-plugin/Jenkins 教程&#xff1a;https://jenkins.io/doc/tutorials/JUnit 教程&#xff1a;JUnit 5 Us…

舆情监测软件报价方案,TOOM舆情监控软件多少钱?

舆情监测软件的价格因公司不同而有所差异&#xff0c;通常在几百元至数千元不等。价格还可能受到功能复杂度、数据量、使用时长等因素的影响。建议您联系多家软件开发商或销售代表&#xff0c;对比各家的产品和报价&#xff0c;以找到适合您需求和预算的解决方案。舆情监测软件…

算法训练营DAY46|139.单词拆分、多重背包的介绍

这一期到了背包问题的最后一期&#xff0c;主要讲解一道leetcodee题&#xff0c;和对多重背包的一些简单介绍&#xff0c;由于leetcode没有对于多重背包的具体问题&#xff0c;且面试基本不会问到多重背包所以只是作为科普。 139. 单词拆分 - 力扣&#xff08;LeetCode&#x…

缺省参数,函数重载,引用的使用(C++)

前言 本文主要讲解的是缺省参数&#xff0c;函数重载&#xff0c;引用的使用. 文章目录 目录 前言 一、缺省参数是什么&#xff1f; 1.缺省参数的分类 二、函数重载是什么&#xff1f; 三、引用是什么&#xff1f; 1.引用特性 总结 提示&#xff1a;以下是本篇文章正文内容&am…

java中的NIO,BIO,AIO

IO&#xff0c;input和output&#xff0c;Java 为 I/O 提供了强大的而灵活的支持&#xff0c;使其更广泛地应用到文件传输和网络编程中。 IO是什么&#xff1f;为什么需要IO&#xff1f; java在1.4之前&#xff0c;提供的是BIO&#xff0c;也就是java.io包下的的东西&#xf…