
`@package` 注解并非用于控制 java 源文件的包声明或输出目录结构,而是为适配某些不遵循“目录即包名”约定的编程语言或建模工具而设计的特殊扩展机制;在标准 java 代码生成场景中,它完全不生效,应通过模板变量(如 `$entity.package`)和 `templates.cfg` 路径配置协同控制包路径与文件位置。
在 Telosys 模型驱动开发中,@Package("com.example.domain") 这类注解常被初学者误认为等同于 Java 的 package 声明或目录映射指令。实际上,它的设计初衷是解耦逻辑包名与物理路径——例如在生成 COBOL、ABAP 或 UML 模型元数据时,目标平台可能将“package”视为纯命名空间概念,与文件系统无关。因此,Telosys 核心引擎不会读取 @Package 来生成 Java 的 package com.example...; 行,也不会据此调整文件写入路径。
✅ 正确做法:Java 项目中应统一使用模板变量驱动包结构
- 在实体模型(.tlv 文件)中,无需添加 @Package;
- 通过 $entity.package 变量显式定义每个实体所属的逻辑包(如在模型中声明 entity User { @package "model.user" });
- 在 templates.cfg 中配置目标路径,例如:
# templates.cfg projectFolder = ${SRC}/${ROOT_PKG}/java/main/${entity.package}此时 Telosys 会将 User.java 输出至 src/main/java/com/mycompany/model/user/User.java(假设 ${ROOT_PKG}=com.mycompany);
- 在 Velocity 模板(如 Entity.java.vm)中,用 package ${ROOT_PKG}.${entity.package};package ${ROOT_PKG}; 动态生成包声明。
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- $entity.package 是模型级属性,需在 .tlv 文件中为每个实体显式设置(或通过全局默认值);
- templates.cfg 不支持嵌套表达式(如 ${target.javaPackageFromFolder(...)}),仅解析基础变量与简单拼接;
- 若需从目录反推包名,应在构建脚本(如 Maven)或外部工具中预处理,而非依赖 Telosys 运行时解析。
总结:@Package 是 Telosys 面向异构语言的可扩展性预留接口,在 Java 生态中应被忽略;真正的包管理权属于模型变量 + 模板 + 配置三者的协同设计。










