Java包命名规范:从核心原则到分层架构实战
1. 项目概述为什么包命名规范不是小事干了这么多年Java我见过太多因为包名乱来而引发的“血案”。一个看似简单的com.example.project背后牵扯到的远不止是代码组织。新手可能觉得包名嘛随便起一个能编译通过就行叫test1、myproject也无所谓。但当你真正参与一个多人协作的中大型项目或者需要对外提供SDK、开源你的代码库时你就会发现一个糟糕的包名就像一颗埋在代码里的定时炸弹。它会让你的代码难以被他人理解在依赖管理上制造混乱甚至在部署和运行时引发意想不到的冲突。包package是Java组织类和接口的基石它提供了命名空间管理、访问控制和模块化部署的能力。而包命名规范就是为这个命名空间制定的一套“交通规则”。它不仅仅是风格问题更是工程实践、团队协作和软件生态融入的必备素养。今天我们就抛开那些枯燥的官方文档从一个一线开发者的角度彻底拆解Java包命名的门道聊聊那些文档里不会写的“潜规则”和踩坑经验。2. 包命名规范的核心原则与深层逻辑2.1 官方建议逆序域名约定及其由来Java官方推荐的包命名规范几乎每个Java开发者都听过使用你所在组织拥有的互联网域名的逆序形式。例如如果你的公司域名是google.com那么你的包名就应该以com.google开头。这个约定看似简单但其设计充满了智慧全球唯一性互联网域名由ICANN统一管理全球唯一。这从根本上解决了不同组织、不同开发者之间包名冲突的问题。只要你们不共用同一个域名你们的包名在理论上就不会冲突。自然形成的层次结构域名本身就有层级顶级域.com、二级域google逆序后com.google天然形成了一个清晰、可扩展的包结构基础。你可以很自然地在后面追加项目名、模块名。归属清晰看到包名就能立刻知道这段代码的来源或所属组织这对于依赖管理和知识产权追溯非常有帮助。注意这里说的是“你所在组织拥有的”域名。如果你个人没有域名通常使用com.github.你的用户名如果你打算将代码托管在GitHub并开源或者io.github.你的用户名。对于纯粹内部学习、永不开源的个人项目使用com.example或me.你的名字也是常见的变通做法但切忌在正式或可能共享的项目中使用test、demo这类过于随意的名称。2.2 超越规范包名承载的四大核心信息一个优秀的包名不仅仅是逆序域名它应该像一个精确的坐标向阅读者传递多层信息。我认为一个完整的包名应该清晰地表达以下四个维度所有者/来源Who这是逆序域名部分如com.alibaba,org.apache回答了代码“从哪来”。项目/产品What紧接着是项目或产品名称如dubbo,kafka指明了代码的归属项目。模块/组件Module在项目内部根据功能或架构划分模块如common,service,controller,client,server。层级/子功能Layer/Sub-feature在模块内部可能还有更细粒度的划分如dao,entity,util。一个典型的包名示例com.company.retail.product.service.implcom.company: 来源公司域名逆序retail: 可能是一个大的产品线或事业部product: 具体的项目或应用名称service: 模块表明这是服务层impl: 子层级服务接口的实现类所在这种结构让代码的物理路径和逻辑架构高度一致新人上手找代码会非常快。2.3 常见反模式与“坑点”实录在实际项目中我见过不少糟糕的包命名实践它们通常为后续开发埋下隐患反模式一以顶级域名开头。例如直接叫project.core。这违反了唯一性约定core这种通用词极容易和其他人的包冲突。反模式二使用下划线或连字符。包名在文件系统中对应目录虽然部分操作系统支持目录名带特殊字符但Java语言规范明确要求包名是合法的Java标识符字母、数字、下划线、美元符号且数字不能开头。实践中强烈建议只使用小写字母和数字用点号分隔。my_project或my-project都是不合规或容易引发问题的。反模式三单数复数混用。比如有的包叫util有的叫utils。团队内应该统一。我的经验是倾向于使用复数形式表示该包下是多个同类工具的集合如utils,helpers而使用单数形式表示一个抽象概念或核心模型如model,entity,config。但最重要的是团队一致。反模式四包层次过深或过浅。过深如com.a.b.c.d.e.f.g会导致导入语句冗长文件路径难以管理过浅所有类都扔在根包下则完全失去了包的组织价值。通常3到5个层级是一个比较舒适的范围。3. 分层架构下的包结构设计实战包结构是项目架构在物理层面的直接体现。不同的架构风格MVC、DDD、六边形架构等会催生不同的包组织方式。这里以最常见的分层架构和领域驱动设计DDD为例展示如何将命名规范落地。3.1 经典三层/四层架构包组织对于传统的Web应用通常采用控制层、服务层、数据访问层这样的划分。包结构可以这样设计com.company.mall ├── config // 配置类 ├── controller // 控制层处理HTTP请求/响应 │ ├── api // 对外API接口 │ └── web // 内部Web页面控制器 ├── service // 业务逻辑层 │ ├── impl // 服务接口实现 │ └── spec // 服务接口定义 ├── dao // 数据访问层接口 (或叫 repository) │ └── impl // 基于MyBatis/JPA等的实现 ├── entity // 数据库实体类 (或叫 model, domain) ├── dto // 数据传输对象用于层间传递 ├── vo // 视图对象用于接口返回 ├── util // 通用工具类 └── exception // 自定义异常类设计要点与争议daovsrepositorydao更偏数据库操作repository是DDD中的概念更偏领域集合的抽象。在Spring Data JPA盛行的今天使用repository作为包名越来越普遍。entity的位置有些项目会把entity放在dao包内认为它紧密耦合于数据层。但我更倾向于将其独立因为实体类可能被服务层、甚至DTO转换逻辑用到它代表核心领域模型不应被数据层“独占”。impl包的必要性当接口和实现都不多时可以直接将实现类与接口放在同一包命名为UserServiceImpl。但当接口和实现类数量增多或者一个接口有多个实现时单独设立impl包能让结构更清晰。一个实用技巧在service包内只放接口在service.impl包内放实现并通过Spring的Service注解扫描impl包这样在引用时import com.company.mall.service.UserService非常干净。3.2 领域驱动设计DDD的包结构DDD强调以业务领域为核心组织代码包结构反映的是领域边界而非技术分层。这对于复杂业务系统尤其有效。com.company.ordering // 订单上下文 ├── domain // 领域层核心 │ ├── model // 聚合根、实体、值对象 │ ├── service // 领域服务纯业务逻辑无依赖 │ └── event // 领域事件 ├── application // 应用层 │ ├── service // 应用服务协调领域对象事务边界 │ └── command // 命令对象 │ └── query // 查询对象 ├── infrastructure // 基础设施层 │ ├── persistence // 持久化实现JPA, MyBatis │ ├── client // 外部服务客户端 │ └── message // 消息中间件适配 └── interfaces // 接口层或叫 adapter ├── rest // RESTful API适配器 ├── rpc // RPC接口适配器 └── dto // 对外的数据传输对象实操心得 在这种结构下包的依赖方向必须严格遵守interfaces-application-domain-infrastructure。domain是核心不依赖任何其他层。这能确保业务逻辑的纯粹性和可测试性。给包命名时domain、application这些名称本身就是DDD的通用语言能极大提升团队内的沟通效率。3.3 工具库与SDK的包命名策略当你开发的是一个供他人使用的工具库或SDK时包命名需要更加考究。清晰的功能划分包名应直接体现功能模块。例如一个网络工具库com.github.tony.network.httpclient、com.github.tony.network.websocket。版本兼容性考虑如果库有多个不兼容的大版本有时会将版本号体现在包名中但这会带来迁移痛苦。更常见的做法是使用不同的MavengroupId或artifactId来区分版本而保持包名不变。例如v1版本groupId: mylib-v1, artifactId: core包名仍是com.mylib.corev2版本groupId: mylib-v2, artifactId: core。这样用户依赖不同的groupId即可代码中的import语句无需修改除非API变了。避免“工具”陷阱不要把所有杂七杂八的方法都扔进一个叫utils的包。应该按功能细分比如StringUtils放入text包DateUtils放入time包IOUtils放入io包。这能让你的库更专业也方便用户按需引入。4. 命名规范的具体细则与自动化检查4.1 大小写、分隔符与关键字禁忌全小写原则这是铁律。com.Company.Product是错误的必须为com.company.product。大写字母在包名中不仅不符合惯例而且在跨平台尤其是Linux/Unix和Windows之间时可能因为文件系统大小写敏感性问题导致类加载失败。分隔符只用点.点号对应文件系统的目录分隔符。严禁使用下划线_或连字符-作为单词分隔。多个单词应直接连接或使用驼峰转换后的全小写形式这里有个细节推荐直接全小写连接如orderprocessing而不是orderProcessing。因为点号已经足够作为分隔包名内部再用驼峰会增加不必要的复杂性且不符合主流开源项目的观察结果如java.util.concurrent.locks。避开Java关键字和常用类名不要使用int、string、system、list等作为包名的一部分即使全小写也会造成极大的混淆。例如com.example.string别人看到import com.example.string.Utils;会第一反应是java.lang.String吗4.2 使用工具强制规范Checkstyle与Spotless规范再好靠人记忆和执行总会出错。必须借助自动化工具将其固化为开发流程的一部分。1. Checkstyle 配置示例 在项目的checkstyle.xml中可以添加以下规则来检查包名module namePackageName property nameformat value^[a-z](\.[a-z][a-z0-9]*)*$/ message keyname.invalidPattern value包名 {0} 必须符合全小写字母和数字由点号分隔的格式。/ /module这个正则表达式^[a-z](\.[a-z][a-z0-9]*)*$确保了以至少一个小写字母开头。后续每个部分由点分隔以小写字母开头可以包含小写字母和数字。整个名称中不允许出现下划线、连字符或大写字母。2. Spotless 格式化插件 Checkstyle是检查Spotless则可以自动修复。在Gradle中配置Spotless的format任务可以集成palantir或google-java-format插件它们通常也内置了包名的格式化规则强制转为小写。在CI/CD流水线中可以设置Spotless的check任务如果代码格式不规范则构建失败。3. IDE的实时辅助 IntelliJ IDEA和Eclipse都支持实时检查代码规范。在IDEA中进入Settings - Editor - Inspections - Java - Naming conventions可以找到包名的检查规则并启用。这样当你在创建包或重命名时如果不符合规范IDE会立刻给出警告或错误提示。4.3 团队内规范统一制定Rename指南即使有了工具在项目中期如果发现包名不规范需要重构批量重命名也是个麻烦事。我建议团队在项目启动时就制定并遵守以下规则确立基础域名确定公司或组织的逆序域名作为所有项目的前缀。制定项目/模块命名模板例如规定业务中台项目以platform结尾前端项目以web或frontend结尾移动端以mobile结尾。创建“包名词典”对于常用的内部模块名如gateway、task、message、job等确定其单一、明确的含义避免同义词混用如同时存在job和task包但功能相似。预演重构方案提前约定如果未来需要修改根包名例如公司域名变更将使用IDE的Refactor - Rename Package功能并同步更新所有相关配置如Spring的组件扫描路径、MyBatis的Mapper扫描路径等。重要提示执行包重命名后务必全局搜索旧的包名字符串因为有些框架如Spring的ComponentScan、MyBatis的mapper的namespace可能在注解或XML配置中硬编码了包名。5. 从包名看项目健康度高级实践与思想包命名规范看似是“表面功夫”实则能深刻反映一个项目的设计质量和团队的工程能力。5.1 包之间的依赖关系分析一个结构良好的项目包之间的依赖关系应该是清晰、单向的而不是网状交织的。你可以使用工具如IntelliJ IDEA的“依赖关系矩阵图”或第三方工具JDepend来分析包之间的耦合度。健康信号controller包依赖service包service包依赖dao包和entity包。依赖箭头始终指向更底层、更稳定的方向。坏味道util包依赖了controller包工具类不应该知道Web层或者entity包依赖了外部的common包领域模型应该保持纯净。出现这种情况往往意味着有类被放错了位置或者出现了循环依赖需要重构。5.2 应对依赖冲突package-info.java的妙用当你的项目引入了两个不同的库它们恰好定义了完全限定名相同的类时就会发生可怕的依赖冲突。JVM的类加载机制决定了只会加载其中一个导致NoSuchMethodError或ClassNotFoundException等运行时错误。除了在构建工具Maven/Gradle中排除冲突依赖外包级别的隔离是一个更深层次的解决方案。虽然你不能改变第三方库的包名但你可以通过为自己的关键代码创建独特的、深层次的包结构来降低冲突概率。更重要的是你可以利用package-info.java文件。package-info.java的主要用途是提供包级别的JavaDoc和注解。但它还有一个隐藏用法声明包级别的注解。例如你可以为你的所有包加上NonNullByDefault注解如果你使用Checker Framework或类似工具进行空值检查。虽然这不能解决类名冲突但它体现了对包作为一个整体单元的重视和管理。5.3 微服务与模块化下的包名演进在微服务架构中每个服务都是独立部署的单元。这时包命名规范有了新的内涵服务间共享代码如果有一些DTO或客户端代码需要在多个服务间共享应该将其抽取为独立的client模块或common模块。这个共享模块的包名应该使用一个代表其公共性的前缀例如com.company.common.auth认证相关公共类然后被各个服务依赖。切忌为了省事在两个服务里复制粘贴相同的类这会导致后期维护噩梦。避免“common”包膨胀很多项目一开始会建一个巨大的common包什么都往里扔。随着项目发展这个包会变成难以理解的“垃圾场”。更好的做法是按功能域划分多个细粒度的公共模块如common-utils、common-database、common-message等每个都有自己清晰的包名和职责。在Java 9引入的模块系统JPMS中module-info.java定义了模块的边界和导出关系。模块名通常也遵循逆序域名约定如com.company.mymodule。这时包名和模块名需要协同设计一个模块可以包含多个包但应该确保模块内包的高内聚并且谨慎决定哪些包通过exports对外暴露。6. 常见问题排查与经验总结6.1 典型问题速查表问题现象可能原因解决方案ClassNotFoundException或NoClassDefFoundError1. 类路径Classpath中确实没有这个类。2.包名写错导致类文件不在预期的目录下。例如类文件在com/example/Test.class但代码中写成了import com.exmaple.Test;拼写错误。1. 检查依赖是否引入。2.仔细核对import语句和文件物理路径是否完全一致。使用IDE的“Go to Definition”功能跳转验证。同一包下的类无法相互访问默认权限对默认访问权限包私有理解有误。默认权限允许同一包下的类访问但必须确保它们在编译后位于同一个目录JAR包中的同一路径。如果因为构建脚本问题导致类被分散到了不同位置就会访问失败。检查构建工具Maven/Gradle的源代码目录设置确保所有源文件都被正确编译并打包到同一个输出目录的相应包路径下。代码在IDE中运行正常但打包JAR后运行出错资源文件如package-info.java、*.properties没有被正确包含进JAR包。Maven默认只打包.java编译后的.class文件和一些特定资源。在pom.xml的build中配置resources确保src/main/resources目录及其子目录保持包结构下的所有文件都被打包。第三方库包名与自有包名意外冲突使用了过于通用的包名前缀如com.util、com.common与引入的某个第三方库包名重合。立即重构改为使用自己拥有的或更独特的域名前缀。这是预防性工作一旦发生冲突解决成本很高。团队新人经常创建错误的包缺乏规范培训和工具约束。1. 将本文档或团队规范加入新人手册。2. 在项目模板archetype或代码生成器如Spring Initializr的自定义模板中预设好标准的包结构。3. 启用CI中的Checkstyle检查在合并代码前拦截不规范命名。6.2 个人实操心得与建议起名是门艺术包名也是一个好的包名应该让人一眼就能猜出里面大概有什么。service比biz好repository比db好。尽量使用领域通用语言Ubiquitous Language中的词汇。保持扁平化但不要“平铺直叙”避免创建只有一两个类的深层子包。例如com.company.project.dao.impl下面如果只有一个UserDaoImpl可以考虑将其直接放在com.company.project.dao包内。但也不要把所有类都堆在根包下。平衡的关键在于内聚性同一个包下的类其变更原因和频率应该是相似的。为“未来”留出空间在设计包结构时考虑一下业务可能的发展方向。例如如果当前只有一种支付方式你可以创建一个payment包。但如果预见到未来会有微信支付、支付宝支付、银联支付等多种实现那么一开始就创建payment包并在其下创建gateway支付网关接口、impl各支付平台实现等子包会比将来重构要轻松得多。文档化你的包结构在项目README或内部Wiki中用一两句话描述每个主要包的职责。这对于快速 onboarding 新成员和后期维护至关重要。package-info.java文件也是一个放置包级别说明的好地方。定期重构不要害怕重构包结构。随着业务演进早期的包划分可能不再合理。定期比如每个季度回顾一下项目结构看看有没有包变得过于臃肿比如common包或者某些类放错了位置。及时的重构就像整理房间能持续保持代码库的清晰和健康。包命名规范它不仅仅是写在团队公约里的一条规则更是贯穿于项目生命周期的一种设计思维。从写下第一个包名开始就决定了代码将以何种面貌生长。花点时间思考并遵循一个好的规范未来你会感谢现在这个“纠结”的自己。

相关新闻

华硕笔记本性能控制革命:G-Helper轻量化控制工具完全指南

华硕笔记本性能控制革命:G-Helper轻量化控制工具完全指南

华硕笔记本性能控制革命:G-Helper轻量化控制工具完全指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook,…

2026/8/6 9:21:31 阅读更多 →
JavaScript箭头函数与普通函数核心差异深度解析

JavaScript箭头函数与普通函数核心差异深度解析

1. 项目概述:为什么我们需要深挖箭头函数与普通函数的区别? 在JavaScript的日常开发中,函数是我们打交道最多的概念之一。从ES6开始,箭头函数(Arrow Function)以其简洁的语法迅速俘获了开发者的心&#xff…

2026/8/6 9:21:31 阅读更多 →
原神帧率解锁完整教程:三步告别60帧限制,畅享高刷新率游戏体验

原神帧率解锁完整教程:三步告别60帧限制,畅享高刷新率游戏体验

原神帧率解锁完整教程:三步告别60帧限制,畅享高刷新率游戏体验 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 厌倦了《原神》游戏中60帧的限制?想要在…

2026/8/6 9:20:31 阅读更多 →

最新新闻

Spring Boot整合AI大模型API:从零构建智能穿搭点评Web应用

Spring Boot整合AI大模型API:从零构建智能穿搭点评Web应用

最近在开发一些趣味性应用时,发现很多开发者想结合AI能力做一些好玩、有创意的项目,但往往卡在如何将AI模型的能力与具体的、有趣的业务场景结合,以及如何设计一个完整的、可交互的前后端应用。比如,想做一个能“锐评”用户穿搭的…

2026/8/6 10:20:59 阅读更多 →
创源 AIGC 全栈创作平台深度评测:从模型整合到导演台实战

创源 AIGC 全栈创作平台深度评测:从模型整合到导演台实战

做内容创作的朋友最近应该都有同感:工具越来越多,但流程却越来越碎。生成一张图用一个平台,写脚本换另一个,剪辑又要导出导入折腾半天。尤其是面对电商大促或者短剧连载这种高强度任务时,光是切换账号和等待渲染就消耗…

2026/8/6 10:20:59 阅读更多 →
哔哩下载姬DownKyi:免费下载B站8K视频的终极解决方案

哔哩下载姬DownKyi:免费下载B站8K视频的终极解决方案

哔哩下载姬DownKyi:免费下载B站8K视频的终极解决方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#x…

2026/8/6 10:20:59 阅读更多 →
Godot 4动画制作全攻略:从单图到骨骼动画,告别呆板游戏动画

Godot 4动画制作全攻略:从单图到骨骼动画,告别呆板游戏动画

1. 项目概述:为什么你的游戏动画总是“差点意思”? 做游戏开发这么多年,我见过太多新手甚至是有一定经验的开发者,在Godot里做动画时,总感觉哪里不对劲。角色移动僵硬得像块木头,UI切换生硬得能硌掉牙&…

2026/8/6 10:20:59 阅读更多 →
Amyloid β-Protein (22-35) ;EDVSNKGAIIGLM

Amyloid β-Protein (22-35) ;EDVSNKGAIIGLM

一、基本信息英文全称:Amyloid β-Protein (22-35)中文全称:β 淀粉样蛋白 22-35 片段三字母序列:Glu-Asp-Val-Gly-Ser-Asn-Lys-Gly-Ala-Ile-Ile-Gly-Leu-Met单字母序列:EDVSNKGAIIGLM氨基酸总数:14 aa分子式&#xff…

2026/8/6 10:20:59 阅读更多 →
GTA5线上小助手:终极免费游戏增强工具完整使用指南

GTA5线上小助手:终极免费游戏增强工具完整使用指南

GTA5线上小助手:终极免费游戏增强工具完整使用指南 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools GTA5线上小助手是一款功能强大的免费开源游戏增强工具,专为GTA5线上模式玩家设…

2026/8/6 10:19:59 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/5 21:00:14 阅读更多 →
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/5 23:46:51 阅读更多 →