Maven 项目中将本地依赖库打包到最终的 JAR 中

Maven 项目中将本地依赖库打包到最终的 JAR 中

文章目录

前言

在现代后端开发中,构建高效且可扩展的 Web 应用程序通常依赖于多种第三方库和内部依赖。这些依赖可以来自公共仓库,也可能是公司内部自研的库或尚未发布到公共仓库的 JAR 包。本文将详细介绍如何在 Maven 项目中处理本地依赖库,并确保这些依赖能够正确地打包到最终的可执行 JAR 文件中。本文不仅以 Doris 连接器(flink-doris-connector)作为示例,还涵盖了处理其他本地依赖库的通用方法。

为什么需要打包本地依赖库?

通常,依赖库可以通过 Maven 中央仓库或其他公共仓库轻松获取和管理。然而,有时我们需要使用一些未发布到公共仓库的本地 JAR 包,例如:

  • 公司内部开发的库
  • 第三方提供但未上传到 Maven 仓库的库
  • 特殊版本或定制版的库
  • 直接引用本地依赖库可能会引发一些问题,尤其是在构建和部署过程中。为了确保项目的可移植性和一致性,必须将这些本地依赖正确地打包到最终的 JAR 文件中。

常见问题:使用 system 作用域

  • 在 Maven 中,可以使用 system 作用域来引用本地 JAR 包。然而,这种方法有几个显著的缺点:
    • 不可移植性:system 作用域依赖的路径是硬编码的,其他开发人员在不同的环境中可能无法找到该路径。
    • 打包问题:使用 system 作用域的依赖默认不会包含在最终打包的 JAR 文件中,导致运行时缺少必要的依赖。
  • 依赖管理的最佳实践为了避免上述问题,推荐的做法是将本地依赖库安装到 Maven 本地仓库中,并使用常规的依赖管理机制进行引用。这样,可以确保依赖库的一致性和可移植性,同时也方便后续的依赖管理和版本控制。
  • 解决方案:将本地依赖库打包到最终 JAR

详细步骤

以下是详细的步骤,展示如何在 Maven 项目中包含本地依赖库并将其打包到最终的 JAR 文件中。

    • -DgroupId:依赖的组织 ID,通常与包名相对应。
    • -DartifactId:依赖的模块名。
    • -Dversion:依赖的版本号。
    • -Dpackaging:依赖的打包类型,通常为 jar。
    • -Dfile:本地 JAR 文件的路径。
  • 步骤 2:修改 pom.xml 文件中的依赖配置安装完成后,需要在项目的 pom.xml 文件中引用该依赖。移除之前使用 system 作用域的配置,并改为默认的 compile 作用域。
    1. 清理之前的构建产物。
    2. 编译项目源代码。
    3. 使用 Maven Shade 插件将所有依赖(包括本地依赖)打包到最终的 JAR 文件中。

步骤 3:重新构建项目

mvn clean package 

此命令将:

修改后的依赖配置注意:省略了 和 元素,默认作用域为 compile,这样 Maven 会自动处理该依赖。

<dependency><groupId>org.apache.doris</groupId><artifactId>flink-connector-doris_${scala.binary.version}</artifactId><version>1.14_2.12-1.1.1</version></dependency>

原始依赖配置(使用 system 作用域)

<dependency><groupId>org.apache.doris</groupId><artifactId>flink-connector-doris_${scala.binary.version}</artifactId><version>1.14_2.12-1.1.1</version><scope>system</scope><systemPath>${project.basedir}/libs/flink-doris-connector-1.14_2.12-1.1.1.jar</systemPath></dependency>

步骤 1:将本地 JAR 安装到 Maven 本地仓库首先,需要将本地的 JAR 包安装到 Maven 的本地仓库中。假设有一个本地的 flink-doris-connector JAR 文件位于项目的 libs 目录下。打开终端,执行以下命令:

mvn install:install-file \ -DgroupId=org.apache.doris \ -DartifactId=flink-connector-doris_2.12 \ -Dversion=1.14_2.12-1.1.1 \ -Dpackaging=jar \ -Dfile=libs/flink-doris-connector-1.14_2.12-1.1.1.jar 

参数说明:通过上述命令,将本地的 JAR 包安装到 Maven 本地仓库中,使其能够像其他依赖一样被 Maven 管理。

Read more

【算法详解】理解KMP,真的那么难吗?—— 一篇讲透它的核心思想

【算法详解】理解KMP,真的那么难吗?—— 一篇讲透它的核心思想

🫧 励志不掉头发的内向程序员:个人主页  ✨️ 个人专栏: 《C++语言》《Linux学习》 🌅偶尔悲伤,偶尔被幸福所完善 👓️博主简介: 文章目录 * 前言 * 一、相关概念 * 二、前缀函数 * 三、计算前缀函数 * 四、用前缀函数解决字符串匹配 * 五、kmp 算法模板 * 六、next 数组版本 * 七、周期和循环节 * 总结 前言 本文用尽量详细的语言来讲解说明 kmp 算法内容,学习之前需要知道一点点动态规划的基础,如果不知道最好去了解了解。我们一起来看看算法吧。 一、相关概念 在学习 kmp 算法之前,我们得先提前了解最基本的 “ 动态规划 ” 的知识,否则可能学习的时候会有一些困难,因为它的原理类似于动态规划。 字符串: * 用字符构成的的序列就是字符串。 这个概念很简单,但是我们这里有个小技巧:就和动态规划那样,

By Ne0inhk
力扣校招算法通关:双指针技巧全场景拆解 —— 从数组操作到环检测的高效解题范式

力扣校招算法通关:双指针技巧全场景拆解 —— 从数组操作到环检测的高效解题范式

文章目录 * 前言 * 双指针 * 例题讲解 * 移动零 力扣 * 复写零 力扣 * 快乐数 力扣 * 盛最多水的容器 力扣 * 有效三角形的个数 力扣 * 查找总价格为目标值的两个商品 力扣 * 三数之和 力扣 前言 在力扣校招算法题中,双指针技巧是一类高频且实用的解题方法。它并非真正的 “指针”,而是通过两个数组下标(或迭代器)的协同移动,在数组划分、区间求解、环检测等场景中实现高效遍历与逻辑处理,往往能将时间复杂度从暴力法的 O(n平方)优化至O(n),是校招笔试和面试中突破数组类难题的关键武器。 本专栏将围绕力扣校招高频的双指针题型展开,从 “移动零”“复写零” 的数组操作,到 “快乐数” 的环检测、“盛最多水的容器” 的区间优化,再到 “三数之和” 的多指针协同,逐一拆解双指针的核心逻辑、边界处理与去重技巧,

By Ne0inhk
图的寻路算法详解:基于深度优先搜索(DFS)的实现

图的寻路算法详解:基于深度优先搜索(DFS)的实现

图的寻路算法详解:基于深度优先搜索DFS的实现 * 一、寻路算法概述 * DFS寻路示例 * 二、算法核心思想 * 数据结构设计 * 三、算法实现详解 * 1. 核心数据结构 * 2. 构造函数初始化 * 3. DFS实现 * 4. 路径查询方法 * 四、完整代码实现 * 五、算法测试与应用 * 测试代码 * 输出结果 * 六、算法分析与优化 * 时间复杂度分析 * 空间复杂度 * 优化方向 * 七、DFS寻路与BFS寻路对比 * 八、实际应用场景 * 九、总结 🌺The Begin🌺点点关注,收藏不迷路🌺 一、寻路算法概述 图的寻路算法是图论中的基础算法之一,用于找到从一个顶点到另一个顶点的路径。深度优先搜索(DFS)是实现寻路算法的一种有效方法,它沿着图的深度方向尽可能远的搜索路径。 DFS寻路示例 0123456 从顶点0到顶点6的DFS路径可能是:

By Ne0inhk
设计五种算法精确的身份证号匹配

设计五种算法精确的身份证号匹配

问题定义与数据准备 我们有两个Excel文件: * small.xlsx: 包含约5,000条记录。 * large.xlsx: 包含约140,000条记录。 目标:快速、高效地从large.xlsx中找出所有其“身份证号”字段存在于small.xlsx“身份证号”字段中的记录,并将这些匹配的记录保存到一个新的Excel文件result.xlsx中。 假设:身份证号字段名在两个表中都是id_card。 首先,我们进行准备工作,安装必要的库并模拟一些数据用于测试和性能估算。 pip install pandas openpyxl import pandas as pd import time import random # 为演示和测试,我们可以创建一些模拟数据(实际中使用pd.read_excel读取你的文件)defgenerate_id_card():"""

By Ne0inhk