通过运行Maven任务使用Freemarker生成txt文件的实现咨询
需求可行性结论
该需求完全可实现,Maven生命周期天生支持在指定阶段绑定定制任务,以下是两种成熟的落地方案:
方案一:使用开源freemarker-maven插件(推荐,零自定义代码)
无需修改你已有的Java逻辑,直接通过插件配置即可完成能力接入:
- 在项目
pom.xml的build/plugins节点添加插件配置,绑定到generate-sources阶段:
<plugin> <groupId>io.github.yangziwen</groupId> <artifactId>freemarker-maven-plugin</artifactId> <version>1.0.1</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>generate</goal> </goals> <configuration> <!-- ftl模板存放目录 --> <templateDirectory>${project.basedir}/src/main/resources/ftl</templateDirectory> <!-- json数据源文件路径 --> <dataModelFile>${project.basedir}/src/main/resources/data/source.json</dataModelFile> <!-- 生成txt的输出目录,建议放到target下避免污染源码 --> <outputDirectory>${project.build.directory}/generated-resources/txt</outputDirectory> <!-- 统一编码避免乱码 --> <encoding>UTF-8</encoding> </configuration> </execution> </executions> </plugin>
- 配置资源打包规则,将生成的txt文件打入最终程序包:
如果输出目录设置为generated-resources下的子目录,大部分场景Maven会自动识别为资源目录,未自动识别的情况下添加如下配置即可:
<build> <resources> <!-- 原有资源配置保留 --> <resource> <directory>${project.basedir}/src/main/resources</directory> </resource> <!-- 新增生成文件的资源配置 --> <resource> <directory>${project.build.directory}/generated-resources/txt</directory> <!-- 可自定义txt在包里的存放路径,根目录填/,classes目录填BOOT-INF/classes即可 --> <targetPath>/</targetPath> </resource> </resources> </build>
- 执行
mvn package时会自动先触发generate-sources阶段生成txt,再将其打进最终的jar/war包。
方案二:自定义Maven插件(适合有复杂定制逻辑的场景)
如果你现有的Java生成逻辑有特殊定制规则,通用插件无法满足,可以把现有逻辑改造为Maven插件:
- 新建独立的Maven插件项目,打包类型设置为
maven-plugin,引入maven-plugin-api和Freemarker相关依赖 - 编写Mojo类,添加
@Mojo(name = "generate-txt", defaultPhase = LifecyclePhase.GENERATE_SOURCES)注解,将你已有的生成逻辑放到Mojo的execute方法中,把模板路径、json路径、输出目录等参数用@Parameter注解做成可配置项 - 将自定义插件发布到本地仓库或私服后,在业务项目的pom中引入插件并绑定到
generate-sources阶段即可,后续打包规则和方案一一致。
注意事项
- 所有生成的文件统一放到
${project.build.directory}(即target目录)下,不要污染源码目录,符合Maven规范 - 如果json数据源需要动态生成,可以在
generate-sources阶段之前绑定其他任务生成json,再传递给Freemarker任务使用
内容的提问来源于stack exchange,提问作者PiotrekM
相关产品推荐
相关产品推荐

