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


    前言

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

    场景描述

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

    
    <dependency>
        <groupId>welinkgroupId>
        <artifactId>welink-sdk-javaartifactId>
        <version>2.2.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    解决

    步骤一

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

    
    <dependency>
        <groupId>welinkgroupId>
        <artifactId>welink-sdk-javaartifactId>
        <version>2.2.0version>
        <scope>systemscope>
        <systemPath>${project.basedir}/lib/welink-sdk-java-2.2.0.jarsystemPath>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这个例子中,我们将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.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <configuration>
                    <includeSystemScope>trueincludeSystemScope>
                    <mainClass>com.luntek.financialattendance.FinancialAttendanceApplicationmainClass>
                configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackagegoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

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

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

    常见问题解答:

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

    总结

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

    建议和最佳实践:

    • 对于定制化 lib 目录中的第三方库,建议使用版本控制工具(比如Git)来管理更新和升级,以避免潜在的依赖冲突和可维护性问题。
    • 保持依赖项的版本更新,并定期查看项目所使用的库的最新版本,以获取新功能和修复的bug。
  • 相关阅读:
    Activiti可视化流程管理器
    单例模式java
    Neuron Newsletter 2022-08|新增 Beckhoff ADS、OPC DA 驱动
    LeetCode | 225. 用队列实现栈
    无涯教程-JavaScript - COSH函数
    通信基础之天线知识梳理---2022/12/05
    [附源码]计算机毕业设计JAVA剧本杀门店管理系统-
    HTML网页设计制作——响应式网页影视动漫资讯bootstrap网页(9页)
    我要表白网HTML+CSS+JS-最浪漫的表白网页在线生成网站
    线程池核心原理浅析
  • 原文地址:https://blog.csdn.net/Da_zhenzai/article/details/134195223