|
@@ -0,0 +1,39 @@
|
|
|
|
|
+import zipfile, os
|
|
|
|
|
+
|
|
|
|
|
+SRC = "target/resource-platform-v2.jar"
|
|
|
|
|
+DST = "target/resource-platform-v3.jar"
|
|
|
|
|
+NEW_CLASS_SRC = "build_tmp_classes/com/example/resourceplatform/common/PurchaseDuration.class"
|
|
|
|
|
+TARGET_ENTRY = "BOOT-INF/classes/com/example/resourceplatform/common/PurchaseDuration.class"
|
|
|
|
|
+
|
|
|
|
|
+with open(NEW_CLASS_SRC, "rb") as f:
|
|
|
|
|
+ new_bytes = f.read()
|
|
|
|
|
+
|
|
|
|
|
+with zipfile.ZipFile(SRC, "r") as zin:
|
|
|
|
|
+ infos = zin.infolist()
|
|
|
|
|
+ manifest = zin.getinfo("META-INF/MANIFEST.MF")
|
|
|
|
|
+ with zipfile.ZipFile(DST, "w", compression=zipfile.ZIP_DEFLATED) as zout:
|
|
|
|
|
+ zout.writestr(manifest, zin.read(manifest.filename))
|
|
|
|
|
+ for info in infos:
|
|
|
|
|
+ name = info.filename
|
|
|
|
|
+ if name == "META-INF/MANIFEST.MF":
|
|
|
|
|
+ continue
|
|
|
|
|
+ if name == TARGET_ENTRY:
|
|
|
|
|
+ zi = zipfile.ZipInfo(name)
|
|
|
|
|
+ zi.compress_type = info.compress_type
|
|
|
|
|
+ zi.external_attr = info.external_attr
|
|
|
|
|
+ zi.date_time = info.date_time
|
|
|
|
|
+ zout.writestr(zi, new_bytes)
|
|
|
|
|
+ print("replaced:", name)
|
|
|
|
|
+ else:
|
|
|
|
|
+ data = zin.read(info.filename)
|
|
|
|
|
+ zi = zipfile.ZipInfo(name, date_time=info.date_time)
|
|
|
|
|
+ zi.compress_type = info.compress_type
|
|
|
|
|
+ zi.external_attr = info.external_attr
|
|
|
|
|
+ zout.writestr(zi, data)
|
|
|
|
|
+ print("wrote", DST, os.path.getsize(DST), "bytes")
|
|
|
|
|
+
|
|
|
|
|
+# sanity: manifest first + class present
|
|
|
|
|
+with zipfile.ZipFile(DST) as z:
|
|
|
|
|
+ names = z.namelist()
|
|
|
|
|
+ print("manifest first?", names[0] == "META-INF/MANIFEST.MF")
|
|
|
|
|
+ print("class present?", TARGET_ENTRY in names)
|