You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JHipster Blueprint:模板生成指定路径文件与获取默认Java包名

JHipster蓝图:如何获取默认Java包名?

编辑说明:原问题为 JHipster Blueprint - How to get default Java package name ?

我正在开发一个重写entity-server子生成器的JHipster蓝图,想要用自定义生成的文件,替换蓝图生成项目里/src/main/java/defaultpackageName/domain/路径下的所有文件,当前使用的files.js代码如下:

const entityServerFiles = {
    noHibernate: [
        //domain files
        {
            path: 'src/main/java/XXX/domain/',
            templates: [
                {
                    file: 'Entity.java',
                    renameTo: generator => `${generator.persistClass}.java`
                }
            ]
        }
    ]
};

function writeFiles() {
    return {
        write() {
            this.writeFilesToDisk(entityServerFiles, this, false);
        }
    }
}

module.exports = {
    writeFiles
};

现在运行代码只会在/src/main/java/路径下创建名为XXX的文件夹,把生成的文件存在这个文件夹里。
请问path配置项src/main/java/XXX/domain/里的XXX位置要填什么内容,才能把文件生成到正确的路径下?

我查阅generator-jhipster项目源码发现,询问用户默认Java包名的交互逻辑在/generator-jhipster/generators/java/index.cjs路径下,核心代码片段如下:

const {
  PACKAGE_NAME,
  PACKAGE_NAME_DEFAULT_VALUE,
  PRETTIER_JAVA_INDENT,
  PRETTIER_JAVA_INDENT_DEFAULT_VALUE,
  BUILD_TOOL,
  BUILD_TOOL_DEFAULT_VALUE,
  BUILD_TOOL_PROMPT_CHOICES,
} = require('./constants.cjs');

get prompting() {
    return {
      async showPrompts() {
        if (this.shouldSkipPrompts()) return;
        await this.prompt(
          [
            {
              name: PACKAGE_NAME,
              type: 'input',
              validate: input => this.validatePackageName(input),
              message: 'What is your default Java package name?',
              default: () => this.sharedData.getConfigDefaultValue(PACKAGE_NAME, PACKAGE_NAME_DEFAULT_VALUE),
            },
          ],
          this.config
        );
      },
    };
  }

按照我的理解,只要在蓝图里访问PACKAGE_NAME常量就能实现需求,具体要怎么操作?


解决方案

你不需要硬编码XXX的固定值,JHipster生成器实例本身已经内置了包名转路径的处理逻辑,直接用生成器自带的属性替换占位符即可,具体改法如下:

  • 首先把path配置里的静态路径改成动态返回的形式,不要写死字符串:
const entityServerFiles = {
    noHibernate: [
        //domain files
        {
            path: generator => `src/main/java/${generator.packageFolder}/domain/`,
            templates: [
                {
                    file: 'Entity.java',
                    renameTo: generator => `${generator.persistClass}.java`
                }
            ]
        }
    ]
};
  • 这里的generator.packageFolder就是JHipster自动把用户输入的包名(比如com.mycompany.myapp)转换成路径格式(com/mycompany/myapp)的内置属性,不需要你自己手动导入常量、替换.为/。
  • 如果你确实需要拿到原始的包名字符串(比如要写文件里的package声明),直接访问generator.packageName就能拿到用户配置的完整包名,不需要单独引入PACKAGE_NAME常量去读配置。
  • 额外注意:如果你重写的子生成器没有继承java生成器的逻辑,要确认你的蓝图生成器配置里加了对java生成器的依赖,保证packageName和packageFolder属性在执行writeFiles阶段已经被正确赋值,否则会出现undefined的问题。

内容的提问来源于stack exchange,提问作者Hervé Labrie-Durand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:21:13