掌握Maven和SpringBoot的灵活性:定制化lib目录和依赖范围

前言

在开发基于Maven和SpringBoot的项目时,我们经常会使用第三方库来满足需求。然而,有时候我们需要更灵活地控制这些库的依赖范围和加载方式。本文将介绍如何使用Maven和SpringBoot实现定制化的lib目录和依赖范围。经过如下定制化后,打包执行jar时就不会报错(运行日志报错显示使用lib下中jar的类ClassNotFoundExceptionNoClassDefFoundError

场景描述

通常情况下,我们会使用特定的第三方库来满足项目需求。在本例中,我们需要使用华为云的Welink接口SDK作为项目的依赖库。首先,让我们了解一下为什么需要使用这个库。Welink接口SDK可以提供与华为云Welink平台的集成功能,例如用户认证、消息推送等。确保项目中的pom.xml文件包含以下依赖项(注意:以下是遐想的dependency,目前Maven中央仓库没有该依赖):

<!--华为云的Welink接口SDK-->
<dependency>
    <groupId>welink</groupId>
    <artifactId>welink-sdk-java</artifactId>
    <version>2.2.0</version>
</dependency>

默认情况下,Maven会从Maven仓库中下载该库的jar包,并将其放入项目的classpath中。然而,有时候可能会遇到Maven镜像仓库无法下载到该依赖项的情况(例如上述依赖),或者我们希望将这个库作为项目的特定依赖,而不是放在整个项目的classpath中。

解决

步骤一

为了实现这个目标,我们可以通过修改该依赖项的scopesystem,并指定systemPath来引用我们自己的jar包。这样,我们就可以将jar包放入项目的lib目录中,并在pom.xml文件中进行如下配置:

<!--华为云的Welink接口SDK-->
<dependency>
    <groupId>welink</groupId>
    <artifactId>welink-sdk-java</artifactId>
    <version>2.2.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/welink-sdk-java-2.2.0.jar</systemPath>
</dependency>

在这个例子中,我们将Welink接口SDK的scope设置为system,并指定systemPath为项目根目录下的lib目录中的jar包。
在这里插入图片描述

常见问题解答:

  • Q: 如何获取Welink接口SDK的jar包?
    A: 您可以到华为云官方网站下载适用于您的项目的最新版本的Welink接口SDK的jar包。
  • Q: 如果我使用的是其他版本的Welink接口SDK,我需要如何更新pom.xml中的依赖项?
    A: 只需将该依赖项的systemPath更改指向你放在lib目录下新下载的jar包即可。

步骤二

除了定制化lib目录外,我们还可能需要对依赖项的加载范围进行定制。默认情况下,Maven会将所有的依赖项都打包到生成的可执行jar文件中。然而,在某些情况下,我们可能只希望将某些依赖项作为项目的运行时依赖,而不包含在可执行jar文件中。

在SpringBoot项目中,我们可以通过配置spring-boot-maven-plugin来实现这一目标。在pom.xml文件中,我们可以添加以下配置:

<build>
    <plugins>
        <!-- 打包插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includeSystemScope>true</includeSystemScope>
                <mainClass>com.luntek.financialattendance.FinancialAttendanceApplication</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在这个例子中,我们将spring-boot-maven-plugin插件的:

  1. includeSystemScope配置项设置为true。这样,该插件将会在打包可执行jar文件时包含所有的系统作用域的依赖项。
  2. <mainClass>com.luntek.financialattendance.FinancialAttendanceApplication</mainClass>:指定Spring Boot应用程序的主类。这是指定可执行jar文件的入口点,该类将被用作应用程序的入口。在运行可执行jar文件时,会自动加载这个类。您需要将com.luntek.financialattendance.FinancialAttendanceApplication替换为您自己应用程序的主类。
  3. <execution>:表示一次插件的执行,可以包含多个<execution>定义。
  4. <goals>:表示插件的目标(goal),指定要执行的插件任务。在这个例子中,我们指定了goalrepackage,表示执行重新打包的任务。这个任务会将项目编译、打包为一个可执行jar文件。

常见问题解答:

  • Q: 如何确定哪些依赖项需要包含或排除?
    A: 根据项目需求和功能要求,确定哪些依赖项是必需的,并将它们添加到或从可执行jar文件中包含。
  • Q: 如果我的项目包含子模块,该怎么处理这些依赖项?
    A: 每个子模块的依赖项可以在其各自的pom.xml文件中进行配置,以提供更细粒度的控制。

总结

通过定制化lib目录和依赖范围,我们可以更灵活地控制项目中使用的第三方库。使用Maven和SpringBoot提供的功能,我们可以根据项目需求来定制依赖项的加载方式,从而提高项目的灵活性和可维护性。

建议和最佳实践:

  • 对于定制化 lib 目录中的第三方库,建议使用版本控制工具(比如Git)来管理更新和升级,以避免潜在的依赖冲突和可维护性问题。
  • 保持依赖项的版本更新,并定期查看项目所使用的库的最新版本,以获取新功能和修复的bug。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法 | 哈希表 No.2】leetcode 219. 存在重复元素II

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

JVM类的声明周期

文章目录 版权声明生命周期概述加载阶段查看内存中的对象 连接阶段连接阶段之验证连接阶段之准备连接阶段之解析 初始化阶段练习题目一练习题目二练习题目三练习题目四 使用阶段卸载阶段总结 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明…

Microsoft Edge不能工作了,可能原因不少,那么如何修复呢

Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…

【安全】Java幂等性校验解决重复点击(6种实现方式)

目录 一、简介1.1 什么是幂等&#xff1f;1.2 为什么需要幂等性&#xff1f;1.3 接口超时&#xff0c;应该如何处理&#xff1f;1.4 幂等性对系统的影响 二、Restful API 接口的幂等性三、实现方式3.1 数据库层面&#xff0c;主键/唯一索引冲突3.2 数据库层面&#xff0c;乐观锁…

学习Opencv(蝴蝶书/C++)相关——1. 前言 和 第1章.概述

文章目录 1. 整体架构1.1 OpenCV3.01.2 Opencv4.xX. 在线文档X.1 Opencv cheatsheet(小抄)1. 整体架构 1.1 OpenCV3.0 对于Opencv3.x版本,网上最常见的图,图自OpenCV Tutorial-Itseez 现在已经不是500+的算法了,而是2500+,详见:About

STM32G030F6P6 芯片实验 (二)

STM32G030F6P6 芯片实验 (二) Hello World - GPIO LED 尝试了下, 从 0 开始建 MDK HAL M0plus Project, 成功点亮 LED了。 但是 ST-LINK跑着跑着, 码飞了! 不知飞哪去了。 只好拿 MX 建了个 MDK Base。 呼叫 SysTick HAL_Delay(), 切换 LED。 基本上都是一样的用法, 只是换…

ICCV2023 Tracking paper汇总(一)(多目标跟随、单目标跟随等)

一、PVT: A Simple End-to-End Latency-Aware Visual Tracking Framework paper&#xff1a; https://openaccess.thecvf.com/content/ICCV2023/papers/Li_PVT_A_Simple_End-to-End_Latency-Aware_Visual_Tracking_Framework_ICCV_2023_paper.pdf github&#xff1a; https://…

java EE 进阶

java EE 主要是学框架(框架的使用,框架的原理) 框架可以说是实现了部分功能的半成品,还没装修的毛坯房,然后我们再自己打造成自己喜欢的成品 这里学习四个框架 : Spring ,Spring Boot, Spring MVC, Mybatis JavaEE 一定要多练习,才能学好 Maven 目前我们主要用的两个功能: …

图像新型拼接

道路摄像头拼接 拼接道路上的摄像头&#xff0c;比较麻烦&#xff0c;如图所示 前后的摄像头都是如此&#xff0c;那么如何拼接摄像头画面呢&#xff0c;像下面这样拼接 测试代码 测试一下代码&#xff0c;使用python import cv2 import numpy as npimg cv2.imread("…

antv/g6之交互模式mode

什么是mode 在 AntV G6 中&#xff0c;“mode” 是用于配置图表交互模式的一种属性。通过设置 “mode”&#xff0c;可以控制图表的行为&#xff0c;以满足不同的交互需求。可能在不同的场景需要展现的交互行为不一样。比如查看模式下点击一个点就选中的状态&#xff0c;在编辑…

数据可视化:折线图

1.初看效果 &#xff08;1&#xff09;效果一 &#xff08;2&#xff09;数据来源 2.JSON数据格式 其实JSON数据在JAVA后期的学习过程中我已经是很了解了&#xff0c;基本上后端服务器和前端交互数据大多是采用JSON字符串的形式 &#xff08;1&#xff09;JSON的作用 &#…

本地idea远程调试服务器程序

本文主要介绍idea本地调试远程服务器程序的方式。相信很多同行跟我一样&#xff0c;在最初接触公司项目的时候&#xff0c;遇到测试提出的缺陷&#xff0c;往往会在本地进行调试、替换jar包远程调试等方式&#xff0c;本地调试往往会导致数据和环境不一致的问题使得问题无法复现…

没想到这么齐全!这份 Python 实战干货yyds

今天我分享一些Python学习神器资料&#xff0c;有需要的小伙文末自行免费领取。 1.200Python练手案例&#xff1a; 2.Python全套视频教程等&#xff1a; 3.浙大Python学习套装&#xff1a; * 4.Python实战案例&#xff1a; 5.Pandas学习大礼包 6.学习手册大礼包 Python知识…

CSAPP BOMB LAB part3

CSAPP BOMB LAB part3 phase_4 bomb.s phase_4的代码: 格式: 40102e行&#xff0c;比较0x8rsp的值和0xe, 需要让0x8rsp小于0xe, 然后跳转到40103a, func函数根据bomb.s 转化为c代码&#xff1a; 这个直接参考了知乎网友的翻译&#xff0c; func4的返回值等于0, 跳转到40…

分治法——找众数

分治法——找众数 要求&#xff1a; 寻找整数数组的众数&#xff0c;如果存在多个众数&#xff0c;则返回权值最小的那个 第一步&#xff1a; 要利用分治法找众数&#xff0c;首先就先要使数组有序。这里&#xff0c;我们用C语言库中的qsort进行快排&#xff1a; qsort(nums…

3D高斯泼溅(Splatting)简明教程

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 3D 高斯泼溅&#xff08;Splatting&#xff09;是用于实时辐射场渲染的 3D 高斯分布描述的一种光栅化技术&#xff0c;它允许实时渲染从小图像样…

直流无刷电机(BLDC)六步换相驱动

直流无刷电机&#xff08;BLDC&#xff09;六步换相驱动 文章目录 直流无刷电机&#xff08;BLDC&#xff09;六步换相驱动1. 前言2. 六步换相原理3. 电角度与机械角度4. 动手实践4.1 霍尔输出表测量4.2 换向控制4.3 代码编写 5. 总结 1. 前言 直流无刷电机相对直流有刷电机具…

Redis之Java操作Redis的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Redis实战开发》。&#x1f3af;&#x1f3af; …

Android java Handler sendMessage使用Parcelable传递实例化对象,我这里传递Bitmap 图片数据

一、Bundle给我们提供了一个putParcelable(key,value)的方法。专门用于传递实例化对象。 二、我这里传递Bitmap 图片数据&#xff0c;实际使用可以成功传统图像数据。 发送&#xff1a;Bundle bundle new Bundle();bundle.putParcelable("bitmap",bitmap);msg.setD…

【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker

介绍 本文件主要介绍如何将SpringBoot应用使用Docker方式部署&#xff0c;并用Gitlab CI/CD进行构建和部署。 环境准备 已安装Gitlab仓库已安装Gitlab Runner&#xff0c;并已注册到Gitlab和已实现基础的CI/CD使用创建Docker Hub仓库&#xff0c;教程中使用的是阿里云的Docker…