当前位置: 首页 > news >正文

【Linux】jar文件软链接和硬链接的操作区别

【Linux】jar文件软链接和硬链接的操作区别

  • 【一】软硬链接对比
  • 【二】创建与使用指南
    • 【1】创建操作
    • 【2】使用场景对比
  • 【三】复制操作注意事项
    • 【1】复制行为对比
      • (1)默认行为 (cp source.jar dest.jar)
      • (2)常用选项及影响
      • (3)推荐做法:​​
    • 【2】最佳实践
  • 【四】压缩操作注意事项
    • 【1】压缩工具行为差异
    • 【2】压缩案例
      • (1)​jar命令 (或 ZIP 工具):​​
      • (2)​tar命令:​​
      • (3)推荐做法与注意事项:​​
  • 【五】重要注意事项总结

【一】软硬链接对比

在这里插入图片描述

总结:​​ 软链接是指向文件名的指针,易受目标移动或删除的影响;硬链接是指向文件数据的直接入口,更稳定但受限于单一文件系统。

【二】创建与使用指南

【1】创建操作

# 创建软链接(推荐用于版本管理)
ln -s hive-connector-3.1.2.jar hive-connector.jar# 创建硬链接(适合空间敏感场景)
ln datax-core-1.0.jar datax-backup.jar

【2】使用场景对比

(1)软链接最佳场景​​:
1-版本切换:app.jar -> app-2.3.0.jar
2-开发环境:dev-config.jar -> config-local.jar
3-依赖管理:lib/mysql.jar -> …/jars/mysql-connector-8.0.jar

(2)硬链接最佳场景​​:
1-备份重要jar:critical.jar和critical_backup.jar
2-节省空间的日志轮转
3-容器内共享基础库

【三】复制操作注意事项

【1】复制行为对比

在这里插入图片描述

(1)默认行为 (cp source.jar dest.jar)

​(1)软链接:​​ 会被复制为新的软链接。新链接指向相同的原始目标路径。如果目标路径是相对路径,其解析基于新链接的位置,这可能不是你想要的(尤其是在目录结构改变时)。

(2)​硬链接:​​ 会被复制为独立的新文件。复制后,dest.jar内的硬链接文件与 source.jar内的原始文件以及原始文件指向的数据不再有任何关联。它们成为两份独立的数据副本。

(3)​结果:​​ JAR 包结构被复制,但链接的语义可能改变(软链接目标解析问题)或完全丢失(硬链接变成独立文件)。

(2)常用选项及影响

(1)​-a/ --archive(或 -dR --preserve=all):​​
这是复制目录树(包括 JAR 这样的压缩包文件)时最常用的选项,旨在保留所有属性(权限、时间戳、所有者、组)和结构。
​软链接:​​ 被保留为链接。目标路径保持不变。
​硬链接:​​ 被保留为硬链接。如果 source.jar内的两个文件是硬链接关系,复制到 dest.jar后,它们仍然是硬链接关系​(共享同一个 inode,在 JAR 内部)。cp会检测并维护源目录树中的硬链接关系。

​命令:​​ cp -a source.jar dest.jar或 cp -dR --preserve=all source.jar dest.jar

(2)-L/ --dereference:​​
总是跟随软链接。复制的是链接指向的实际文件内容,而不是链接本身。
​软链接:​​ 被替换为它指向的实际文件或目录的副本。链接本身消失。
​硬链接:​​ 行为与默认或 -a类似,通常会被保留为硬链接(除非与 -H组合有特殊情况)。
​命令:​​ cp -L source.jar dest.jar

(3)​-H:​​
仅在命令行参数是符号链接时,才解引用(复制目标内容)。对在遍历目录树过程中遇到的符号链接无效。在复制单个 JAR 文件时,如果 source.jar本身是一个软链接,-H会让 cp复制它指向的实际 JAR 文件。对 JAR 包内部的链接无效。通常不单独用于处理 JAR 内容内部的链接。

(3)推荐做法:​​

(1)​保留链接结构:​​ 使用 cp -a source.jar dest.jar。这是最安全、最符合预期的复制方式,能保持 JAR 包内部结构不变。
​(2)解引用所有软链接:​​ 使用 cp -L source.jar dest.jar。这会将所有软链接替换为它们指向的实际内容。​注意:​​ 这可能导致:
文件重复:如果多个软链接指向同一个大文件,该文件会被复制多份。
循环链接:如果存在循环软链接,cp可能会失败或产生巨大文件。
目标不存在:如果链接悬空,复制会报错。

【2】最佳实践

# 保持软链接结构的复制
rsync -av --copy-links /app/libs/ /backup/libs/# 完整复制实际内容
cp -RL /deployment/jars /backup/jars_content

【四】压缩操作注意事项

【1】压缩工具行为差异

在这里插入图片描述

【2】压缩案例

Spring Boot 应用通常使用 jar命令(基于 ZIP 格式)或 Maven/Gradle 插件(底层也使用 ZIP)打包。tar也是常见的归档工具。

(1)​jar命令 (或 ZIP 工具):​​

(1)​默认行为:​​
​软链接:​​ 会被存储为特殊的 ZIP 条目,标记为符号链接,并记录目标路径。解压时,如果支持(如 Unix 系统),会重建软链接。在 Windows 上解压,如果没有额外支持,可能会创建包含目标路径的文本文件。
​硬链接:​​ ​不会被特殊处理。每个硬链接条目都被视为独立的文件进行压缩和存储。解压后,所有硬链接都变成独立的文件副本。​硬链接关系完全丢失!​​
(2)​注意事项:​​
ZIP/JAR 格式本身不原生支持存储硬链接关系。
使用标准 jar或 zip命令打包包含硬链接的目录,会导致最终 JAR 包内存在多份相同数据的副本,显著增大 JAR 包体积。
解压后,软链接能否正确重建取决于解压环境和工具。

(2)​tar命令:​​

(1)​默认行为:​​
​软链接:​​ 默认被存储为链接条目(类型 '2’Symlink),包含目标路径名。tar很好地支持软链接。
​硬链接:​​ 默认被存储为链接条目(类型 '1’Hardlink),包含指向的目标文件名(在归档内)。tar支持存储硬链接关系。

(2)​关键选项:​​
​-h/ --dereference:​​
跟随软链接。归档的是链接指向的实际文件内容,而不是链接本身。
​硬链接:​​ 此选项不影响硬链接的处理。硬链接关系通常仍会被保留(除非使用 --hard-dereference,但很少用)。

创建包含链接的 tar:​​ tar -cvf app.tar /path/to/your/app(保留软硬链接)
​创建解引用软链接的 tar:​​ tar -chvf app.tar /path/to/your/app

(3)​后续压缩:​​ 通常会将 tar 包压缩成 .tar.gz或 .tar.xz:tar -czvf app.tar.gz /path/to/your/app(保留链接) 或 tar -chzvf app.tar.gz /path/to/your/app(解引用软链接)。

(3)推荐做法与注意事项:​​

(1)​Spring Boot JAR (ZIP):​​
​软链接:​​ 通常可以安全打包。确保目标路径在运行时环境有意义(相对路径基于 JAR 内位置或容器内绝对路径)。
​硬链接:​​ ​强烈避免!​​ ZIP/JAR 格式不支持,会导致数据重复和体积膨胀。如果目录中存在硬链接,应在打包前将其移除或替换为软链接或副本。使用 find . -type f -links +1查找硬链接。

(2)​使用 tar归档:​​
如果需要保留硬链接关系(例如创建备份或迁移),使用 tar(如 tar -cvf …) 是更好的选择,因为它能正确保存硬链接信息。之后可以压缩这个 tar 包。
使用 -h选项可以控制是否解引用软链接。

【五】重要注意事项总结

(1)​硬链接在 ZIP/JAR 中是敌人:​​ Spring Boot JAR 本质是 ZIP。硬链接在 ZIP 中会变成独立副本,浪费空间。​在构建 Spring Boot JAR 前,确保项目目录中没有硬链接。​​
(2)​软链接路径:​​ JAR 内的软链接使用相对路径最安全(相对于链接在 JAR 中的位置)。绝对路径在容器化或不同部署环境中容易失效。
(3)​解压环境:​​ 打包时保留的软链接,其能否在解压后正确工作(尤其是在 Windows 上)取决于解压工具。
(4)​循环链接:​​ 打包或复制时,避免目录树中存在循环软链接,这可能导致命令失败或产生无效结果。
(5)​cp -a是复制的好朋友:​​ 复制整个 JAR 文件时,cp -a能最大程度保留原始状态(包括链接)。
(6)​tar对链接更友好:​​ 如果需要归档包含硬链接的目录结构,优先使用 tar。
(7)​明确意图:​​ 在编写脚本时,清楚自己是想保留链接结构还是解引用链接。选择合适的命令选项。
(8)​测试:​​ 在关键操作(如构建部署包、复制生产 JAR)后,检查 JAR 包内容(jar tvf your.jar或 unzip -l your.jar)或解压测试,确认链接是否按预期处理。

​处理建议:​​
(1)​构建 Spring Boot JAR:​​ 确保项目目录本身不包含硬链接。软链接需谨慎使用(相对路径优先)。构建插件(Maven spring-boot-maven-plugin/ Gradle bootJar)会按 ZIP 标准处理软链接。
(2)​复制 Spring Boot JAR:​​ 使用 cp -a source.jar dest.jar。
(3)​归档包含链接的目录:​​
需要保留硬链接 -> 用 tar -cvf(然后可压缩)。
不需要保留硬链接 / 准备打包成 JAR -> 确保无硬链接,或用 cp -L/ tar -chvf解引用软链接后再打包。
只需处理软链接 -> 根据是否需要链接本身选择 tar -cvf或 tar -chvf。


文章转载自:

http://fJ2wpVWY.mqLsf.cn
http://83XNrFUT.mqLsf.cn
http://Mk86F1NJ.mqLsf.cn
http://ugb9nI5a.mqLsf.cn
http://CvUyO0bH.mqLsf.cn
http://CUaMdb2D.mqLsf.cn
http://XOiXyJe4.mqLsf.cn
http://Xil8uc9l.mqLsf.cn
http://XdQKKxs3.mqLsf.cn
http://hCJM82C4.mqLsf.cn
http://7NCY915k.mqLsf.cn
http://FvHquJHe.mqLsf.cn
http://T6M4bwYq.mqLsf.cn
http://dGdOrgax.mqLsf.cn
http://zJ5Ynj7S.mqLsf.cn
http://xftLroSw.mqLsf.cn
http://Qsbk2Kv3.mqLsf.cn
http://wT0a8G7K.mqLsf.cn
http://rK4FaLum.mqLsf.cn
http://YlHf4TZJ.mqLsf.cn
http://rOhwU5wl.mqLsf.cn
http://Sm0J67sY.mqLsf.cn
http://r6zieD5d.mqLsf.cn
http://24bpp9Jt.mqLsf.cn
http://3caIkzTO.mqLsf.cn
http://p9Shipis.mqLsf.cn
http://XXwJ16uC.mqLsf.cn
http://Xi4mTlAO.mqLsf.cn
http://fICoPmlt.mqLsf.cn
http://Xj8ebQ2v.mqLsf.cn
http://www.dtcms.com/a/376880.html

相关文章:

  • java控制台手动
  • Java入门级教程16——集合
  • docker桌面版 镜像配置
  • JVM 全面详解:深入理解 Java 的核心运行机制
  • JVM分代收集:原理与调优策略
  • 使用.NET标准库实现多任务并行处理的详细过程
  • 软件测试:功能测试详解
  • 数字图像处理-图像编码
  • 基于RDMA 通信的可负载均衡高性能服务架构
  • java多线程场景3-并发处理和异步请求
  • <uniapp><指针组件>基于uniapp,编写一个自定义箭头指针组件
  • 新手向:中文语言识别的进化之路
  • Jakarta EE 课程 --- 微型资料投递与分发(Mini Drop-off Box)
  • 【船类】监控录像下船舶类别检测识别数据集:近7k图像,6类,yolo标注
  • 《UE5_C++多人TPS完整教程》学习笔记51 ——《P52 使用我们的瞄准偏移(Using Our Aim Offsets)》
  • 腾讯云远程桌面连接不上?5步排查法解决RDP连接失败
  • ffplay播放pcm
  • 计算机毕业设计 基于Hadoop的B站数据分析可视化系统的设计与实现 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 【Halcon 】Halcon 裁剪尺寸的像素陷阱全解析:为什么要 -0.5,为什么要 -1,而圆却不用?
  • 机器视觉质检数据融合PLM:产品缺陷根因分析新范式
  • 【超详细图文教程】2025年最新Win10 系统安装 MySQL 教程
  • 医疗行业面临的网络安全挑战及应对策略
  • JVM CMS垃圾回收器深度解析
  • 鸿蒙Next ArkWeb进程解析:多进程架构如何提升Web体验
  • Credo发布专为低功耗、高带宽与超低时延的AI网络打造的Bluebird 1.6T光DSP芯片
  • Shell 循环语句与函数全解析
  • Zookeeper核心知识全解:节点类型、集群架构与选举机制
  • Android 项目中 Gradle 配置实战:多渠道打包、签名配置、版本管理
  • 新手向:实现验证码程序
  • 【小程序】微信小程序隐私协议