1)工程目录结构:
2)Test.ftl // ftl文件内容,里面的东西使用Map进行填充
package com.example.a.b.c;
public class Test {
public String ${filed1};
public int ${filed2};
}
3)Main.java // 生成代码封装(主要就是指定模板引擎内容+生产的文件路径)
package org.example;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
public class Main {
public static void main(String[] args) throws Exception {
Map<String, Object> valueMap = new HashMap<>();
valueMap.put("filed1", "name");
valueMap.put("filed2", "age");
gen(valueMap, ".", "Test.ftl", "src/main/gen", "com.example.a.b.c", "Test.java");
}
/**
* @param valueMap 传递到模板中的数据
* @param useTemplatePath 使用的template位于什么地方
* @param useTemplateName 使用的模板的名字
* @param outPutPath 生成代码的路径,如:gen下
* @param genPackageName 生成的包名
* @param genFileName 生成的包的名字
* @throws Exception
*/
private static void gen(Map<String, Object> valueMap, String useTemplatePath, String useTemplateName,
String outPutPath, String genPackageName, String genFileName) throws Exception {
final String ENCODING = "UTF-8";
// 指定模板存放的路径
TemplateLoader loader = new FileTemplateLoader(new File(useTemplatePath));
Configuration cfg = new Configuration();
cfg.setTemplateLoader(loader);
cfg.setEncoding(Locale.getDefault(), ENCODING);
// 指定使用的模板
Template template = cfg.getTemplate(useTemplateName, ENCODING);
template.setEncoding(ENCODING);
// 生成代码的路径 replace替换的只能是字符,replaceAll则是正则
File filePath = new File(outPutPath, genPackageName.replace(".", File.separator)); // replaceAll ???
if (!filePath.exists()) {
filePath.mkdirs();
}
// 生成的代码位置和名字
File targetFile = new File(filePath, genFileName);
if (targetFile.exists()) {
targetFile.delete();
}
template.process(valueMap, new OutputStreamWriter(new FileOutputStream(targetFile, false), ENCODING));
}
}
4)pom.xml // 引入FreeMarker包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>TestFreeMarker</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
</dependencies>
</project>
总结:
最终的话,是需要把这些工具打包为jar包,然后就可以当做脚本去使用了,需要传递的参数通过命令行传递过去即可。
注意生成的代码在例子中是gen目录下。
freemarker和通过简单的文件写生成代码本质是一样的,但是提供一些:比如 if语句之类的操作。使得更加通用一些。