ProjectReactor.java 4.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package cn.iocoder.yudao;
  2. import cn.hutool.core.io.FileUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.commons.io.FileUtils;
  6. import java.io.File;
  7. import java.nio.charset.StandardCharsets;
  8. import java.util.Collection;
  9. import java.util.regex.Matcher;
  10. import java.util.stream.Collectors;
  11. /**
  12. * 项目修改器,一键替换 Maven 的 groupId、artifactId,项目的 package 等
  13. * <p>
  14. * 通过修改 groupIdNew、artifactIdNew、projectBaseDirNew 三个变量
  15. *
  16. * @author 芋道源码
  17. */
  18. @Slf4j
  19. public class ProjectReactor {
  20. private static final String GROUP_ID = "cn.iocoder.boot";
  21. private static final String ARTIFACT_ID = "yudao";
  22. private static final String PACKAGE_NAME = "cn.iocoder.yudao";
  23. private static final String TITLE = "芋道管理系统";
  24. public static void main(String[] args) {
  25. long start = System.currentTimeMillis();
  26. String projectBaseDir = getProjectBaseDir();
  27. // ========== 配置,需要你手动修改 ==========
  28. String groupIdNew = "cn.huwing.boot";
  29. String artifactIdNew = "zdm";
  30. String packageNameNew = "cn.huwing.zdm";
  31. String titleNew = "测试名管理系统";
  32. String projectBaseDirNew = projectBaseDir + "-new"; // 一键改名后,“新”项目所在的目录
  33. log.info("[main][新项目路径地址]projectBaseDirNew: " + projectBaseDirNew);
  34. // 获得需要复制的文件
  35. log.info("[main][开始获得需要重写的文件]");
  36. Collection<File> files = listFiles(projectBaseDir);
  37. log.info("[main][需要重写的文件数量:{},预计需要 5-10 秒]", files.size());
  38. // 写入文件
  39. files.forEach(file -> {
  40. String content = replaceFileContent(file, groupIdNew, artifactIdNew, packageNameNew, titleNew);
  41. writeFile(file, content, projectBaseDir, projectBaseDirNew, packageNameNew, artifactIdNew);
  42. });
  43. long end = System.currentTimeMillis();
  44. log.info("[main][重写完成]共耗时:" + (end - start) / 1000 + "秒");
  45. }
  46. private static String getProjectBaseDir() {
  47. return StrUtil.subBefore(new File(ProjectReactor.class.getClassLoader().getResource(File.separator).getFile()).getPath(), "\\yudao-server", false);
  48. }
  49. private static Collection<File> listFiles(String projectBaseDir) {
  50. Collection<File> files = FileUtils.listFiles(new File(projectBaseDir), null, true);
  51. // 移除 IDEA Git GitHub 自身的文件; Node 编译出来的文件
  52. files = files.stream()
  53. .filter(file -> !file.getPath().contains("\\target\\")
  54. && !file.getPath().contains("\\node_modules\\")
  55. && !file.getPath().contains("\\.idea\\")
  56. && !file.getPath().contains("\\.git\\")
  57. && !file.getPath().contains("\\.github\\")
  58. && !file.getPath().contains("\\dist\\")
  59. && !file.getPath().contains(".iml")
  60. && !file.getPath().contains(".html.gz"))
  61. .collect(Collectors.toList());
  62. return files;
  63. }
  64. private static String replaceFileContent(File file, String groupIdNew,
  65. String artifactIdNew, String packageNameNew,
  66. String titleNew) {
  67. return FileUtil.readString(file, StandardCharsets.UTF_8)
  68. .replaceAll(GROUP_ID, groupIdNew)
  69. .replaceAll(PACKAGE_NAME, packageNameNew)
  70. .replaceAll(ARTIFACT_ID, artifactIdNew) // 必须放在最后替换,因为 ARTIFACT_ID 太短!
  71. .replaceAll(StrUtil.upperFirst(ARTIFACT_ID), StrUtil.upperFirst(artifactIdNew))
  72. .replaceAll(TITLE, titleNew);
  73. }
  74. private static void writeFile(File file, String fileContent, String projectBaseDir,
  75. String projectBaseDirNew, String packageNameNew, String artifactIdNew) {
  76. String newPath = file.getPath().replace(projectBaseDir, projectBaseDirNew) // 新目录
  77. .replace(PACKAGE_NAME.replaceAll("\\.", Matcher.quoteReplacement(File.separator)),
  78. packageNameNew.replaceAll("\\.", Matcher.quoteReplacement(File.separator)))
  79. .replace(ARTIFACT_ID, artifactIdNew) //
  80. .replaceAll(StrUtil.upperFirst(ARTIFACT_ID), StrUtil.upperFirst(artifactIdNew));
  81. FileUtil.writeUtf8String(fileContent, newPath);
  82. }
  83. }