每個新專案都要手動配置 pom.xml、web.xml、Spring 配置、資料庫連線池、工具類、基礎包結構……這些樣板代碼 100% 可復用,唯一變化只是 groupId、artifactId、版本號。本文展示一個基於模板替換的自動生成器,輸出標準 Maven 多模組骨架,生成即可運行。
${artifactId}-parent // 父 POM,統一依賴版本
├── ${artifactId}-common // 工具類、常數、異常、基礎 DTO
├── ${artifactId}-domain // 實體類、VO、Enum
├── ${artifactId}-dao // MyBatis Mapper、XML、Repository
├── ${artifactId}-service // 介面 + 實現、事務邊界
├── ${artifactId}-rpc // Hessian/Dubbo 遠程介面發布
├── ${artifactId}-web // Spring MVC Controller、View、靜態資源
└── ${artifactId}-cache // Redis/本地緩存封裝(可選)
public class MavenProjectGenerator {
// 固定參數
private static final String GROUP_ID = "com.example";
private static final String ARTIFACT_ID = "myapp";
private static final String TEMPLATE_ROOT = "E:/generateProject/sourceTemplate";
private static final String OUTPUT_ROOT = "E:/generateProject/targetProject/" + ARTIFACT_ID;
// 版本號映射表(對應模板中的 ${spring-webmvc} 等佔位符)
private static final Map VERSION_MAP = Map.of(
"${spring-webmvc}", "5.3.30",
"${mybatis}", "3.5.13",
// ...
);
public static void main(String[] args) {
new MavenProjectGenerator().generate();
}
void generate() {
recurseCopyAndReplace(new File(TEMPLATE_ROOT));
}
void recurseCopyAndReplace(File src) {
for (File f : src.listFiles()) {
String relPath = f.getAbsolutePath().substring(TEMPLATE_ROOT.length() + 1);
// 1. 替換目錄名中的 ${groupId}/${artifactId}
String targetDir = replacePlaceholders(relPath, true);
// 2. 若為 Java 源碼目錄,需依 package 聲明再細分子目錄
if (isJavaSourceDir(f)) {
targetDir += "/" + extractPackageDir(f);
}
File target = new File(OUTPUT_ROOT, targetDir);
target.mkdirs();
if (f.isDirectory()) {
recurseCopyAndReplace(f);
} else {
String content = readFile(f);
content = replacePlaceholders(content);
if (f.getName().equals("pom.xml")) content = replaceVersions(content);
writeFile(new File(target, f.getName()), content);
}
}
}
// 關鍵輔助方法:佔位符替換、版本號替換、package 目錄推導、IO 操作...
}
src/main/java/${groupId}/${artifactId}/web。package ${groupId}.${artifactId}.web.controller; 生成時同步替換。pom.xml 統一使用 ${spring-webmvc} 等版本佔位符,生成時統一替換,避免版本散落。jdbc.properties, log4j.xml)同理替換。${artifactId}-parent 執行 mvn clean install -DskipTests。${artifactId}-web 模組(Tomcat/Jetty 插件或打 WAR 部署)。Velocity/FreeMarker 替換字串替換,支援 #if/#foreach 條件生成。JCommander/Picocli 做 CLI 工具:gen -g com.my -a myapp -v 1.0.0。spring-mvc、spring-boot、microservice。README.md、.gitignore、Dockerfile、Jenkinsfile 等工程化配套。maven-archetype,IDE New Project → Maven Archetype 直接選用。源碼完整版:GitHub studydemo。投入半天開發生成器,節省每個專案數小時搭建時間,長期 ROI 極高。