build_v7.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import zipfile, os, subprocess, glob, sys, shutil
  2. BASE = os.path.dirname(os.path.abspath(__file__))
  3. SRC = os.path.join(BASE, "src", "main", "java")
  4. RES = os.path.join(BASE, "src", "main", "resources")
  5. OUT = os.path.join(BASE, "build_tmp_classes")
  6. LIB = os.path.join(BASE, "lib")
  7. JAVAC = r"D:\Program Files\Java\jdk-17\bin\javac.exe"
  8. LOMBOK = r"C:\Users\BXD-XTYW\.m2\repository\org\projectlombok\lombok\1.18.32\lombok-1.18.32.jar"
  9. SRC_JAR = os.path.join(BASE, "target", "resource-platform-v6.jar")
  10. DST_JAR = os.path.join(BASE, "target", "resource-platform-v7.jar")
  11. # 1) 准备依赖 classpath: 从 fat jar 抽取 BOOT-INF/lib 到 lib/(若缺失), 并放入 lombok
  12. os.makedirs(LIB, exist_ok=True)
  13. if not glob.glob(os.path.join(LIB, "*.jar")):
  14. with zipfile.ZipFile(SRC_JAR) as z:
  15. for name in z.namelist():
  16. if name.startswith("BOOT-INF/lib/") and name.endswith(".jar"):
  17. out = os.path.join(LIB, os.path.basename(name))
  18. with open(out, "wb") as f:
  19. f.write(z.read(name))
  20. if not os.path.exists(os.path.join(LIB, "lombok-1.18.32.jar")):
  21. shutil.copy(LOMBOK, os.path.join(LIB, "lombok-1.18.32.jar"))
  22. dep_jars = sorted(glob.glob(os.path.join(LIB, "*.jar")))
  23. cp = ";".join(dep_jars)
  24. print("classpath entries:", len(dep_jars))
  25. # 2) 编译全部源码
  26. sources = []
  27. for root, _, files in os.walk(SRC):
  28. for f in files:
  29. if f.endswith(".java"):
  30. sources.append(os.path.join(root, f))
  31. print("source files:", len(sources))
  32. os.makedirs(OUT, exist_ok=True)
  33. cmd = [JAVAC, "-parameters", "-encoding", "UTF-8", "-cp", cp, "-d", OUT] + sources
  34. r = subprocess.run(cmd, capture_output=True)
  35. print("javac returncode:", r.returncode)
  36. if r.returncode != 0:
  37. err = (r.stderr or b"").decode("utf-8", "replace")
  38. print("=== STDERR (first 40 lines) ===")
  39. print("\n".join(err.splitlines()[:40]))
  40. sys.exit(1)
  41. print("compiled classes:", len(glob.glob(os.path.join(OUT, "**", "*.class"), recursive=True)))
  42. # 3) 重打包: 以 v6 为基底, 替换最新编译的 class, 并注入 src/main/resources 中的资源(xml等)
  43. with zipfile.ZipFile(SRC_JAR) as zin:
  44. infos = zin.infolist()
  45. def local_for(entry_name):
  46. # 已编译 class: 来自 OUT
  47. if entry_name.startswith("BOOT-INF/classes/") and entry_name.endswith(".class"):
  48. rel = entry_name[len("BOOT-INF/classes/"):]
  49. local = os.path.join(OUT, rel)
  50. if os.path.isfile(local):
  51. return local
  52. return None
  53. # 资源文件: 用 src/main/resources 中的最新版本
  54. if entry_name.startswith("BOOT-INF/classes/"):
  55. rel = entry_name[len("BOOT-INF/classes/"):]
  56. local = os.path.join(RES, rel)
  57. if os.path.isfile(local):
  58. return local
  59. return None
  60. manifest_name = "META-INF/MANIFEST.MF"
  61. all_names = set(zin.namelist())
  62. # 收集 src/main/resources 中新增的、jar 里没有的资源条目
  63. extra_resources = []
  64. for root, _, files in os.walk(RES):
  65. for f in files:
  66. full = os.path.join(root, f)
  67. rel = os.path.relpath(full, RES).replace("\\", "/")
  68. entry = "BOOT-INF/classes/" + rel
  69. if entry not in all_names:
  70. extra_resources.append((entry, full))
  71. with zipfile.ZipFile(DST_JAR, "w", compression=zipfile.ZIP_DEFLATED) as zout:
  72. mi = next(i for i in infos if i.filename == manifest_name)
  73. zout.writestr(mi, zin.read(manifest_name))
  74. for i in infos:
  75. if i.filename == manifest_name:
  76. continue
  77. local = local_for(i.filename)
  78. if local:
  79. with open(local, "rb") as lf:
  80. data = lf.read()
  81. zi = zipfile.ZipInfo(i.filename)
  82. zi.external_attr = i.external_attr
  83. zi.date_time = i.date_time
  84. zout.writestr(zi, data)
  85. else:
  86. zout.writestr(i, zin.read(i.filename))
  87. for entry, full in extra_resources:
  88. with open(full, "rb") as lf:
  89. data = lf.read()
  90. zi = zipfile.ZipInfo(entry)
  91. zout.writestr(zi, data)
  92. print("built:", DST_JAR, "exists:", os.path.exists(DST_JAR))
  93. zm = zipfile.ZipFile(DST_JAR)
  94. print("manifest first:", zm.namelist()[0] == manifest_name)
  95. xml_name = "BOOT-INF/classes/mapper/ResourceMapper.xml"
  96. print("mapper xml present:", xml_name in zm.namelist())