Maven systemPath加载本地JAR:原理、场景与最佳实践
1. 项目概述为什么需要systemPath加载本地JAR在Java开发中Maven几乎是项目构建和依赖管理的代名词。我们习惯了在pom.xml里声明一个依赖坐标Maven就会自动从中央仓库或配置的镜像仓库下载对应的JAR包到本地仓库通常是~/.m2/repository整个过程优雅且自动化。但总有一些“特殊情况”会打破这种优雅让你不得不面对一个现实问题如何让Maven项目使用一个不在任何远程仓库只存在于你本地磁盘某个角落的JAR包这就是systemPath登场的时候。你可能接手了一个遗留项目里面用到了一个公司内部早已停止维护、没有上传到任何Maven仓库的私有工具包或者你正在调试一个自己修改了源码、临时打包的第三方库又或者你依赖的某个硬件厂商提供的SDK对方只给了一个孤零零的JAR文件。这些场景下你无法通过标准的dependency坐标来获取依赖。此时scopesystem/scope配合systemPath元素就成了一个直接的解决方案——它允许你指定一个文件系统路径让Maven直接从那里加载JAR。然而这个方案在Maven社区中口碑两极分化。有人说它是“救急的利器”也有人说它是“构建毒药”。究其原因system作用域和systemPath破坏了Maven依赖管理最核心的可移植性和可重复性。一个在你机器上能成功编译的项目到了同事那里可能就因为找不到那个特定路径下的JAR而构建失败。但不可否认在特定过渡期、原型验证或处理绝对无法纳入仓库管理的依赖时它确实是最快、最直接的接入方式。理解其原理、正确用法以及背后的权衡是每个资深Java开发者工具箱里必备的一项技能。2. systemPath的核心机制与使用场景剖析2.1 system作用域与systemPath的运作原理要理解systemPath必须先厘清Maven的system作用域。在Maven的依赖作用域Scope体系中system是一个特殊的存在。它不像compile、runtime、test那样与项目的生命周期和类路径有标准的关联而是明确告诉Maven“这个依赖不由你来管理它由系统环境提供你只需要按我给的路径把它加到类路径里就行。”其核心运作机制可以分解为三步声明与路径绑定在pom.xml中通过dependency声明一个依赖并将其scope设置为system。同时必须提供systemPath元素其值是一个指向本地文件系统绝对路径的URI。Maven在解析这个依赖时不会去查询本地或远程仓库而是直接读取这个路径下的文件。依赖解析与安装在mvn install或mvn package阶段Maven会验证systemPath指向的文件是否存在。如果存在它会将该文件“安装”到当前项目的构建上下文中其行为类似于将该JAR包放入本地仓库的一个特殊位置但实际并不复制到~/.m2。如果文件不存在构建会直接失败。类路径构建根据scope的值虽然是system但其传递性等行为需额外注意Maven决定在编译、测试、运行时是否将该JAR包添加到对应的类路径Classpath中。对于scopesystem的依赖默认情况下它会参与编译和运行时类路径但不具有传递性。一个最基础的配置示例如下dependency groupIdcom.example/groupId artifactIdmy-local-lib/artifactId version1.0/version scopesystem/scope systemPath${project.basedir}/libs/my-local-lib-1.0.jar/systemPath /dependency这里${project.basedir}是Maven内置属性指向pom.xml所在的目录。我们通常建议将这类本地JAR放在项目目录下的某个子文件夹如/libs中并使用相对路径这在一定程度上改善了可移植性。2.2 典型使用场景与决策权衡什么情况下你应该考虑使用systemPath这并不是一个首选方案而是一个权衡后的选择。场景一处理遗留或第三方闭源JAR这是最常见的场景。你可能会遇到老旧的企业内部工具包历史遗留系统没有源码也没有部署到私有仓库。硬件设备SDK如某些打印机、扫描仪、加密狗厂商提供的Java SDK通常只有一个JAR文件。特定版本且无法从仓库获取的库例如某个紧急修复需要特定版本的库但该版本已被从公共仓库移除而你手头有该版本的JAR。场景二本地开发与快速原型验证在开发过程中如果你正在修改一个第三方库并需要在自己的主项目中立即测试修改效果最快捷的方式就是将修改后的库源码打包成JAR例如使用mvn clean install安装到本地仓库或者直接jar -cvf打包。在主项目中通过systemPath直接引用这个刚打包出来的JAR文件路径。 这样做避免了频繁执行mvn install到本地仓库的操作尤其是当本地仓库索引更新有延迟时可以实现更快速的“编码-打包-测试”循环。场景三应对网络隔离或仓库故障在完全离线的开发环境如某些保密项目或内网环境中如果搭建私有仓库如Nexus的条件暂不具备将所有依赖JAR放入项目lib目录并用systemPath引用是一种简单粗暴但有效的临时方案。重要权衡为什么systemPath是“最后的手段”尽管有上述场景但你必须清楚其代价破坏可移植性这是最大的问题。路径是绝对的或相对于特定机器。项目分享给他人时对方必须拥有完全相同的文件路径结构否则构建失败。破坏依赖管理Maven无法管理其传递依赖。如果这个本地JAR本身又依赖其他库你需要手动处理所有依赖极易引发ClassNotFoundException或NoSuchMethodError。影响构建工具集成CI/CD流水线如Jenkins、GitLab CI通常会在干净的环境中构建项目。systemPath指向的本地文件在构建服务器上几乎肯定不存在导致流水线失败。版本管理混乱version字段在这里几乎形同虚设无法通过Maven的依赖冲突解决机制来管理版本。因此决策流程应该是优先尝试将JAR安装到本地Maven仓库mvn install:install-file或部署到私有仓库。只有当这些方式都不可行时才将systemPath作为临时过渡方案并务必在项目文档中明确说明且计划在未来将其替换为标准依赖。3. 完整配置详解与实操步骤3.1 pom.xml中的标准配置语法让我们深入拆解systemPath依赖在pom.xml中的完整配置。一个健壮的配置需要考虑路径的灵活性和环境适应性。project ... dependencies !-- 场景引用项目根目录下 libs/ 文件夹中的JAR -- dependency !-- 自定义的 groupId 和 artifactId用于在项目中标识此依赖 -- groupIdorg.vendor.hardware/groupId artifactIddevice-sdk/artifactId version2.1.5/version !-- 版本号应与JAR文件实际版本一致便于识别 -- scopesystem/scope systemPath${project.basedir}/libs/device-sdk-2.1.5.jar/systemPath /dependency !-- 场景引用系统环境变量指定的路径下的JAR稍具可移植性 -- dependency groupIdcom.internal/groupId artifactIdlegacy-utils/artifactId version1.0.0/version scopesystem/scope !-- 假设我们在环境变量或 settings.xml 中定义了 CUSTOM_LIB_PATH -- systemPath${env.CUSTOM_LIB_PATH}/legacy-utils.jar/systemPath /dependency /dependencies ... /project关键元素解析groupId/artifactId/version这三个坐标在system作用域下不用于依赖解析仅作为项目内部的标识符。建议你根据JAR的实际来源和版本进行有意义地命名这能极大提高pom.xml的可读性。scopesystem/scope必须显式声明。systemPath其值必须是一个有效的文件URI。支持绝对路径不推荐C:\Users\name\libs\foo.jar或/home/name/libs/foo.jar相对路径推荐使用Maven属性如${project.basedir}构建相对于项目根目录的路径。环境变量通过${env.VAR_NAME}引用系统环境变量。Maven属性可以引用在pom.xml的properties中或settings.xml中定义的属性。3.2 增强可移植性的配置技巧为了缓解systemPath固有的可移植性问题我们可以采用一些技巧技巧一使用Maven属性集中管理路径在pom.xml的properties部分定义属性使路径配置集中化、语义化。properties !-- 定义一个属性指向本地库目录 -- local.lib.dir${project.basedir}/third-party-libs/local.lib.dir !-- 甚至可以定义具体的JAR文件名 -- sdk.jar.namesome-sdk-4.2.0.jar/sdk.jar.name /properties dependencies dependency groupIdcom.example.sdk/groupId artifactIdsome-sdk/artifactId version4.2.0/version scopesystem/scope !-- 引用属性配置更清晰 -- systemPath${local.lib.dir}/${sdk.jar.name}/systemPath /dependency /dependencies这样当需要修改路径或JAR文件名时只需改动属性值即可。技巧二结合Maven Profiles应对不同环境对于团队协作可以为不同开发者或环境配置不同的路径。profiles profile iddeveloper-a/id properties custom.lib.path/Users/alice/company-libs/custom.lib.path /properties /profile profile iddeveloper-b/id properties custom.lib.pathD:\company\shared-libs/custom.lib.path /properties /profile /profiles dependencies dependency groupIdcom.internal/groupId artifactIdshared-tool/artifactId version1.0/version scopesystem/scope systemPath${custom.lib.path}/shared-tool.jar/systemPath /dependency /dependencies每位开发者激活自己的Profile如mvn clean install -Pdeveloper-a即可使用自己的本地路径。但这依然是权宜之计最佳实践还是统一使用仓库。3.3 将本地JAR安装到Maven本地仓库推荐替代方案在大多数情况下将本地JAR安装到本地Maven仓库是比systemPath好得多的选择。它让依赖管理回归Maven的标准模式。使用Maven的install:install-file目标mvn install:install-file \ -Dfile/path/to/your-local.jar \ -DgroupIdcom.yourcompany \ -DartifactIdyour-artifact \ -Dversion1.0.0 \ -Dpackagingjar \ -DgeneratePomtrue参数解释-Dfile本地JAR文件的绝对路径。-DgroupId, -DartifactId, -Dversion你为这个JAR定义的坐标。-Dpackaging打包类型通常是jar。-DgeneratePom是否为该构件生成一个基本的POM文件。执行成功后该JAR会被安装到你的本地仓库~/.m2/repository/com/yourcompany/your-artifact/1.0.0/。之后你就可以在pom.xml中使用标准的依赖声明了dependency groupIdcom.yourcompany/groupId artifactIdyour-artifact/artifactId version1.0.0/version /dependency这种方法解决了可移植性问题只要团队成员都执行一遍安装命令即可也保持了Maven依赖管理的所有优势。对于团队更好的做法是将其部署到内部的Nexus或Artifactory私有仓库实现一次部署全员可用。4. 高级应用、问题排查与避坑指南4.1 处理依赖传递与打包部署scopesystem的依赖在依赖传递和最终打包行为上表现特殊这是最容易踩坑的地方。1. 依赖传递性问题system作用域的依赖不具有传递性。这意味着如果你的项目A通过systemPath引入了库X然后项目B依赖项目A那么库X不会自动传递给项目B。项目B必须自己重新声明对库X的依赖同样使用systemPath或其它方式。这与compile作用域的依赖行为完全不同务必在模块化项目中留意。2. 打包部署WAR/JAR问题这是systemPath最大的痛点之一默认情况下system作用域的依赖不会被打包进最终的可执行JAR如Spring Boot的fat jar或WAR文件中。因为Maven认为它是“系统提供”的运行时环境应该自有该库。对于可执行JARSpring Boot你需要通过其他方式将JAR包含进去。例如在Spring Boot Maven插件中配置includeSystemScopetrue/includeSystemScope但此选项已不推荐或失效取决于版本。更可靠的做法是方案A推荐将本地JAR安装到本地仓库后使用标准依赖。方案B使用maven-dependency-plugin在package阶段将该JAR复制到构建输出目录并确保类路径包含它。这非常繁琐。plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-dependency-plugin/artifactId executions execution idcopy-system-dependency/id phasepackage/phase goals goalcopy/goal /goals configuration artifactItems artifactItem groupIdorg.vendor.hardware/groupId artifactIddevice-sdk/artifactId version2.1.5/version typejar/type overWritetrue/overWrite outputDirectory${project.build.directory}/lib/outputDirectory /artifactItem /artifactItems /configuration /execution /executions /plugin然后在启动脚本中手动指定-cp或-Dloader.pathSpring Boot来包含这个lib目录。对于WAR包同样system依赖默认不打包进WEB-INF/lib。你需要配置maven-war-plugin来显式包含它plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-war-plugin/artifactId configuration webResources resource directory${project.basedir}/libs/directory targetPathWEB-INF/lib/targetPath includes include**/*.jar/include /includes /resource /webResources /configuration /plugin4.2 常见问题排查实录在实际操作中你会遇到各种与systemPath相关的问题。下面是一个快速排查指南问题现象可能原因排查步骤与解决方案编译错误Missing artifact ...:jar:1.0:system1.systemPath指向的文件不存在。2. 路径错误权限、拼写、空格。3. 在IDE中未正确识别Maven变更。1. 检查systemPath的完整路径使用绝对路径进行测试。2. 在命令行执行mvn clean compile -e查看详细错误信息确认Maven查找的具体路径。3. 在IDE中尝试执行Maven - Update Project强制更新快照。运行时ClassNotFoundException或NoClassDefFoundError1. 该system依赖未被打包进最终发布产物如fat jar。2. 该JAR本身有传递依赖缺失。1. 检查最终生成的JAR/WAR包中是否包含了该依赖。参考4.1节配置打包插件。2. 使用jdeps或IDE的依赖分析工具检查该本地JAR自身的依赖并手动将它们也加入项目依赖。IDE如IntelliJ IDEA报红但命令行构建成功IDE的Maven集成未能正确解析system作用域依赖。1.IDEA:打开File - Settings - Build - Build Tools - Maven - Importing确保勾选了Import Maven projects automatically。然后对项目右键Maven - Reimport。2. 有时需要手动将JAR添加为项目的LibraryFile - Project Structure - Libraries - - Java选择该JAR。在多模块项目中子模块无法使用父模块中定义的system依赖system作用域依赖不具有传递性。必须在需要该依赖的每个子模块的pom.xml中单独声明。考虑将公共的本地JAR安装到本地仓库或在父POM中通过dependencyManagement定义坐标和systemPath但子模块仍需显式引用只是不用写版本和路径。Maven构建成功但单元测试失败system依赖可能没有被添加到测试类路径。虽然system默认范围包括test但某些IDE或插件配置可能导致问题。1. 确认测试运行配置的类路径是否包含该JAR。2. 尝试将scope改为compile如果只是为了测试且不影响打包但这通常不是好主意。更好的方法是使用maven-surefire-plugin配置额外的类路径。4.3 实操心得与终极建议经过多年项目实战我对systemPath的使用总结出以下几点心得永远将其视为临时方案在项目文档或pom.xml中以注释形式明确标注所有systemPath依赖并说明原因和待办事项例如“TODO: 将xyz.jar部署到Nexus后移除systemPath”。统一管理本地JAR的位置在项目根目录下创建一个如/external-libs的文件夹将所有需要通过systemPath引用的JAR都放进去。然后在.gitignore中忽略这个文件夹但同时在项目README中提供如何获取这些JAR的详细说明如从内部网盘下载。这样既避免了将二进制文件提交到Git导致仓库膨胀又为团队成员提供了明确的指引。利用Maven Wrapper和脚本自动化对于团队项目可以编写一个初始化脚本如init.sh或init.bat。脚本首先检查/external-libs目录是否存在且JAR齐全如果不全则提示用户手动下载或从指定位置复制。然后脚本可以自动执行mvn install:install-file命令将所有本地JAR安装到每位开发者的本地仓库。这样就将“特殊处理”的步骤标准化和自动化了。优先探索“仓库化”方案对于公司内部库搭建一个Nexus或Artifactory私有仓库是长远之计。一次性投入长期受益。对于无法修改的第三方JAR使用install:install-file安装到本地仓库是最小可行改进。可以编写一个脚本让所有新加入的开发者一键执行。对于源码可得的第三方库考虑将其作为Git子模块git submodule引入在项目内部通过一个子模块的pom.xml进行管理然后主项目依赖这个子模块。这提供了版本控制能力。最后记住一个核心原则Maven的核心价值在于声明式依赖管理和构建可重复性。systemPath是对这一原则的破坏。当你不得不使用它时你是在用短期的便利换取长期的技术债务。清晰认知这一点并积极规划将其替换掉的路径是负责任的技术决策。

相关新闻

蛋糕烘焙的分享平台源码 Java+SpringBoot+Vue 前后分离

蛋糕烘焙的分享平台源码 Java+SpringBoot+Vue 前后分离

一、关键词蛋糕烘焙交流社区,蛋糕烘焙的分享平台,蛋糕烘焙爱好者交流平台二、作品包含源码数据库全套环境和工具资源本地部署教程三、项目技术前端技术:Html、Css、Js、Vue2、Element-ui后端技术:Java、SpringBoot2、MyBatis四、运…

2026/8/16 7:46:23 阅读更多 →
2026四大AI写作辅助网站深度横评|写论文别瞎用,按能力选

2026四大AI写作辅助网站深度横评|写论文别瞎用,按能力选

近年来,AI 写论文早已成为大学生的常见操作,但工具乱用直接踩雷已成为不少学生的血泪教训。 很多同学对通用 AI 和学术 AI 的区别缺乏认知,无论是课程作业还是毕业论文,都随意套用工具进行改写、润色、降重。结果往往导致 AI 检测…

2026/8/16 7:45:23 阅读更多 →
LeetCode AI侧边栏:苏格拉底式启发与模拟面试重塑算法思维

LeetCode AI侧边栏:苏格拉底式启发与模拟面试重塑算法思维

如果你正在准备技术面试,刷 LeetCode 可能是你每天都要面对的“必修课”。但你是否也经历过这样的困境:面对一道新题,要么毫无头绪,要么看了答案恍然大悟,但下次遇到类似问题依然不会?传统的“看题-看答案”…

2026/8/16 7:45:23 阅读更多 →

最新新闻

不推倒现有系统:面向多遗留业务系统的AI智能中台建设思路

不推倒现有系统:面向多遗留业务系统的AI智能中台建设思路

摘要当前国内中大型企业普遍完成多轮信息化建设,沉淀了ERP、MES、WMS、PLM、OA、CRM、财务系统等大量存量业务系统,形成了典型的异构、碎片化、烟囱式IT架构。传统数字化建设多聚焦于数据汇聚与接口打通,仅实现数据物理连通,未解决…

2026/8/16 8:33:46 阅读更多 →
Java调用栈获取全解析:从Thread到StackWalker的四种方式对比与实践

Java调用栈获取全解析:从Thread到StackWalker的四种方式对比与实践

1. 项目概述:为什么我们需要获取调用栈信息? 在Java开发中,尤其是进行日志记录、性能监控、框架开发或者调试复杂业务逻辑时,我们经常会遇到一个看似简单却至关重要的需求: 如何知道当前这段代码是被谁调用的&#xf…

2026/8/16 8:33:46 阅读更多 →
Linux命令行高效操作与自动化运维实战

Linux命令行高效操作与自动化运维实战

1. Linux命令基础与核心价值 在服务器运维、嵌入式开发和科研计算等领域,Linux命令行始终是高效工作的核心工具。我至今记得第一次通过 grep 命令在日志中快速定位问题的震撼——这种无需图形界面就能精准操控系统的能力,正是Linux的魅力所在。 为什么…

2026/8/16 8:33:46 阅读更多 →
重装系统后黑屏全攻略:从硬件排查到驱动修复的完整解决方案

重装系统后黑屏全攻略:从硬件排查到驱动修复的完整解决方案

1. 问题现象与初步排查:从“黑屏”到“有迹可循” 刚给电脑重装完系统,满心欢喜地按下重启键,结果屏幕一片漆黑,只有风扇在转,指示灯在亮。这种从希望到失望的落差,相信不少朋友都经历过。这不仅仅是“黑屏…

2026/8/16 8:32:46 阅读更多 →
C++初始化列表:高效对象构造的必知技巧

C++初始化列表:高效对象构造的必知技巧

在 C 中,对象的初始化是每个开发者都必须掌握的基础能力,也是面试中高频考察的知识点。很多初学者在编写构造函数时,常常混淆「初始化」与「赋值」的区别,导致代码存在隐藏的性能开销,甚至因为 const 成员、引用成员或…

2026/8/16 8:32:46 阅读更多 →
操作系统用户态与内核态:从隔离原理到性能优化实战

操作系统用户态与内核态:从隔离原理到性能优化实战

1. 从一次“程序无法运行”的报错说起最近在社区里看到一个挺有意思的求助帖,一位开发者朋友在尝试运行一个名为claude.exe的程序时,系统弹出了“指定的可执行文件不是此操作系统平台的有效应用程序”的错误。这个看似简单的报错,其实背后牵扯…

2026/8/16 8:32:46 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →