Java包名必须全部小写且采用反向域名形式,旨在避免类名冲突、支持逻辑分组、满足JLS规范及构建工具要求;合法包名仅含ASCII字母、数字、下划线和美元符,但禁用$和_开头或连续出现,且不可为关键字。

Java 包名必须全部小写,采用反向域名(reverse domain name)形式,这是官方强制要求,不是建议。
为什么必须用反域名写法
目的是避免不同组织或项目的类名冲突。例如公司域名为 example.com,则包名应以 com.example 开头。JVM 本身不校验包名合法性,但构建工具、IDE 和模块系统(如 JPMS)依赖该约定识别归属和作用域。
- 域名所有权可作为命名空间归属的客观依据
- 层级结构天然支持包的逻辑分组(如 com.example.backend.user)
- 符合 Java SE 规范(JLS §6.1)和 Maven/Gradle 默认坐标映射规则
合法包名的组成规则
包名只能包含 ASCII 字母、数字、下划线(_)和美元符($),但**强烈禁止使用 $ 和 _ 开头或连续出现**,且不能是 Java 关键字或字面量(如 int、true)。
- ✅ 正确:com.example.myapp、org.apache.commons.lang3
- ❌ 错误:com.Example.MyApp(含大写)、com.example.2024api(数字开头)、com.example.user-list(含连字符)
- ⚠️ 不推荐:com.example._internal(以下划线开头)、com.example.util$helper(含 $,易与编译器生成类混淆)
常见实践细节
实际项目中还需注意语义清晰和一致性:
立即学习“Java免费学习笔记(深入)”;
- 顶层域名后紧跟组织/项目标识,如 com.github.username(开源项目)、cn.edu.tsinghua(国内高校)
- 模块内子包按功能分层,避免过深(一般 ≤ 4 层),如 com.example.shop.order.service
- 测试代码包名通常与主代码对应,仅在末尾加 .test 或 .testing,如 com.example.shop.order.service.test
- 不要为“通用工具类”创建孤立的顶级包如 util 或 common,应归属到组织域名下(如 com.example.common)
IDE 和构建工具的影响
IntelliJ IDEA 和 Eclipse 默认按包名生成目录结构,Maven 的 groupId 通常直接映射为包名前缀。若包名违反反域名规则,可能导致:
- Maven 依赖解析异常(尤其在多模块聚合项目中)
- Javadoc 生成失败或链接错误
- JPMS 模块声明(module-info.java)中 requires 语句无法匹配模块名
- 部分静态分析工具(如 SonarQube)报出高危警告










