ProjectReactor.java 4.3 KB

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