build_v6.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import zipfile, os, subprocess, glob, sys
  2. BASE = os.path.dirname(os.path.abspath(__file__))
  3. SRC = os.path.join(BASE, "src", "main", "java")
  4. OUT = os.path.join(BASE, "build_tmp_classes")
  5. LIB = os.path.join(BASE, "lib")
  6. JAVAC = r"D:\Program Files\Java\jdk-17\bin\javac.exe"
  7. SRC_JAR = os.path.join(BASE, "target", "resource-platform-v5.jar")
  8. DST_JAR = os.path.join(BASE, "target", "resource-platform-v6.jar")
  9. # 1) 收集依赖 classpath
  10. dep_jars = sorted(glob.glob(os.path.join(LIB, "*.jar")))
  11. cp = ";".join(dep_jars)
  12. print("classpath entries:", len(dep_jars))
  13. # 2) 编译全部源码
  14. sources = []
  15. for root, _, files in os.walk(SRC):
  16. for f in files:
  17. if f.endswith(".java"):
  18. sources.append(os.path.join(root, f))
  19. print("source files:", len(sources))
  20. os.makedirs(OUT, exist_ok=True)
  21. cmd = [JAVAC, "-parameters", "-encoding", "UTF-8", "-cp", cp, "-d", OUT] + sources
  22. r = subprocess.run(cmd, capture_output=True)
  23. print("javac returncode:", r.returncode)
  24. if r.returncode != 0:
  25. err = (r.stderr or b"").decode("utf-8", "replace")
  26. print("=== STDERR (first 40 lines) ===")
  27. print("\n".join(err.splitlines()[:40]))
  28. sys.exit(1)
  29. print("compiled classes:", len(glob.glob(os.path.join(OUT, "**", "*.class"), recursive=True)))
  30. # 3) 重打包: 以 v5 为基底, 替换 BOOT-INF/classes 下新编译的 class
  31. with zipfile.ZipFile(SRC_JAR) as zin:
  32. infos = zin.infolist()
  33. names = set(zin.namelist())
  34. def class_local(entry_name):
  35. # 仅替换真正的 .class 文件; 目录条目(以/结尾)直接沿用原 jar
  36. if entry_name.startswith("BOOT-INF/classes/") and entry_name.endswith(".class"):
  37. rel = entry_name[len("BOOT-INF/classes/"):]
  38. local = os.path.join(OUT, rel)
  39. if os.path.isfile(local):
  40. return local
  41. return None
  42. # MANIFEST 必须第一个写入
  43. manifest_name = "META-INF/MANIFEST.MF"
  44. with zipfile.ZipFile(DST_JAR, "w", compression=zipfile.ZIP_DEFLATED) as zout:
  45. mi = next(i for i in infos if i.filename == manifest_name)
  46. zout.writestr(mi, zin.read(manifest_name))
  47. for i in infos:
  48. if i.filename == manifest_name:
  49. continue
  50. local = class_local(i.filename)
  51. if local:
  52. with open(local, "rb") as lf:
  53. data = lf.read()
  54. zi = zipfile.ZipInfo(i.filename)
  55. zi.external_attr = i.external_attr
  56. zi.date_time = i.date_time
  57. zout.writestr(zi, data)
  58. else:
  59. zout.writestr(i, zin.read(i.filename))
  60. print("built:", DST_JAR, "exists:", os.path.exists(DST_JAR))
  61. print("manifest first:", zipfile.ZipFile(DST_JAR).namelist()[0] == manifest_name)