From 9dfadd2177eada3313df378d48f94486b6b5676c Mon Sep 17 00:00:00 2001 From: kyle Date: Tue, 2 Sep 2025 20:02:45 +0800 Subject: [PATCH 1/3] Fix 1. Fixed the issue of nested jar files not working properly after saving 2. Fixed the issue of unresponsive class files being dragged into windows 3. Add jar to save progress 4. Fix local lib dependencies --- pom.xml | 8 +++++ .../me/grax/jbytemod/utils/task/LoadTask.java | 1 + .../me/grax/jbytemod/utils/task/SaveTask.java | 31 +++++++++-------- src/main/java/me/lpk/util/JarUtils.java | 33 ++++++++++++++++--- .../java/me/lpk/util/drop/JarDropHandler.java | 8 ++--- .../org/objectweb/asm/tree/ClassNode.java | 5 +++ 6 files changed, 61 insertions(+), 25 deletions(-) diff --git a/pom.xml b/pom.xml index 0036fbb..c6fa144 100644 --- a/pom.xml +++ b/pom.xml @@ -167,6 +167,8 @@ org.bitbucket.mstrobel procyon 0.5.33 + system + ${basedir}/lib/procyon-0.5.33.jar @@ -183,16 +185,22 @@ com.weblaf weblaf 1.2.9 + system + ${basedir}/lib/weblaf-complete-1.29-fixed.jar org.benf reader 1.3.9 + system + ${basedir}/lib/cfr_0_139.jar com.sun attach 1.7 + system + ${basedir}/lib/attach-1.7.jar commons-cli diff --git a/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java b/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java index c702ac3..8dbe470 100644 --- a/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java +++ b/src/main/java/me/grax/jbytemod/utils/task/LoadTask.java @@ -99,6 +99,7 @@ private void readJar(JarFile jar, JarEntry en, Map classes, M try { final ClassNode cn = ASMUtils.getNode(bytes); if (cn != null) { // && (cn.name.equals("java/lang/Object") ? true : cn.superName != null) + cn.innerPath = en.getName(); classes.put(cn.name, cn); } } catch (Exception e) { diff --git a/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java b/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java index 69e5add..846927f 100644 --- a/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java +++ b/src/main/java/me/grax/jbytemod/utils/task/SaveTask.java @@ -1,19 +1,17 @@ package me.grax.jbytemod.utils.task; -import java.io.File; -import java.nio.file.Files; -import java.util.List; -import java.util.Map; - -import javax.swing.SwingWorker; - -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.ClassNode; - import me.grax.jbytemod.JByteMod; import me.grax.jbytemod.JarArchive; import me.grax.jbytemod.ui.PageEndPanel; import me.lpk.util.JarUtils; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.tree.ClassNode; + +import javax.swing.*; +import java.io.File; +import java.nio.file.Files; +import java.util.List; +import java.util.Map; public class SaveTask extends SwingWorker { @@ -53,12 +51,17 @@ protected Void doInBackground() throws Exception { ClassNode node = classes.get(s); ClassWriter writer = new ClassWriter(flags); node.accept(writer); - outputBytes.put(s + ".class", writer.toByteArray()); - publish((int) ((i++ / size) * 50d)); + String name; + if (node.innerPath != null && !node.innerPath.isEmpty()) { + name = node.innerPath; + } else { + name = s + ".class"; + } + outputBytes.put(name, writer.toByteArray()); + publish((int) ((i++ / size) * 20d)); } - publish(50); JByteMod.LOGGER.log("Saving.."); - JarUtils.saveAsJar(outputBytes, output.getAbsolutePath()); + JarUtils.saveAsJar(outputBytes, output.getAbsolutePath(), process -> publish((int) (20d + process*80d))); JByteMod.LOGGER.log("Saving successful!"); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/me/lpk/util/JarUtils.java b/src/main/java/me/lpk/util/JarUtils.java index f935ed9..084e206 100644 --- a/src/main/java/me/lpk/util/JarUtils.java +++ b/src/main/java/me/lpk/util/JarUtils.java @@ -1,5 +1,8 @@ package me.lpk.util; +import org.apache.commons.io.IOUtils; +import org.objectweb.asm.tree.ClassNode; + import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -8,16 +11,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.stream.Stream; +import java.util.zip.CRC32; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import org.apache.commons.io.IOUtils; -import org.objectweb.asm.tree.ClassNode; - public class JarUtils { /** * Creates a map of for a given jar file @@ -125,13 +127,34 @@ public static Map loadNonClassEntries(File jarFile) throws IOExc * @param fileName */ public static void saveAsJar(Map outBytes, String fileName) { + saveAsJar(outBytes, fileName, null); + } + public static void saveAsJar(Map outBytes, String fileName, Consumer progress) { try { JarOutputStream out = new JarOutputStream(new java.io.FileOutputStream(fileName)); + double i = 1; + double size = outBytes.size(); for (String entry : outBytes.keySet()) { - out.putNextEntry(new ZipEntry(entry)); - if (!entry.endsWith("/")) + JarEntry jarEntry = new JarEntry(entry); + + if (entry.endsWith("/")) { + out.putNextEntry(jarEntry); + } else { + byte[] content = outBytes.get(entry); + if (entry.endsWith(".jar")) { + jarEntry.setMethod(JarEntry.STORED); + jarEntry.setSize(content.length); + jarEntry.setCompressedSize(content.length); + CRC32 crc32 = new CRC32(); + crc32.update(content); + jarEntry.setCrc(crc32.getValue()); + } + out.putNextEntry(jarEntry); out.write(outBytes.get(entry)); + } out.closeEntry(); + if (progress != null) + progress.accept(i++/size); } out.close(); } catch (IOException e) { diff --git a/src/main/java/me/lpk/util/drop/JarDropHandler.java b/src/main/java/me/lpk/util/drop/JarDropHandler.java index 699a129..93f2ad2 100644 --- a/src/main/java/me/lpk/util/drop/JarDropHandler.java +++ b/src/main/java/me/lpk/util/drop/JarDropHandler.java @@ -1,12 +1,11 @@ package me.lpk.util.drop; +import javax.swing.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.io.File; import java.util.List; -import javax.swing.TransferHandler; - public class JarDropHandler extends TransferHandler { private static final long serialVersionUID = 1232L; private final IDropUser user; @@ -37,10 +36,7 @@ public boolean importData(TransferHandler.TransferSupport info) { } user.preLoadJars(id); for (File jar : data) { - if (jar.getName().toLowerCase().endsWith(".jar")) { - user.onJarLoad(id, jar); - break; - } + user.onJarLoad(id, jar); } return true; } diff --git a/src/main/java/org/objectweb/asm/tree/ClassNode.java b/src/main/java/org/objectweb/asm/tree/ClassNode.java index 3ac53d4..71f35a8 100644 --- a/src/main/java/org/objectweb/asm/tree/ClassNode.java +++ b/src/main/java/org/objectweb/asm/tree/ClassNode.java @@ -66,6 +66,11 @@ public class ClassNode extends ClassVisitor { */ public String name; + /** + * The internal path of the jar file. + */ + public String innerPath; + /** * The signature of the class. May be null. */ From 1f171860e310d89b462c4ef9f05752e8154406b1 Mon Sep 17 00:00:00 2001 From: kyle Date: Tue, 2 Sep 2025 20:35:23 +0800 Subject: [PATCH 2/3] Fix 1. local lib dependencies restore --- pom.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pom.xml b/pom.xml index c6fa144..0036fbb 100644 --- a/pom.xml +++ b/pom.xml @@ -167,8 +167,6 @@ org.bitbucket.mstrobel procyon 0.5.33 - system - ${basedir}/lib/procyon-0.5.33.jar @@ -185,22 +183,16 @@ com.weblaf weblaf 1.2.9 - system - ${basedir}/lib/weblaf-complete-1.29-fixed.jar org.benf reader 1.3.9 - system - ${basedir}/lib/cfr_0_139.jar com.sun attach 1.7 - system - ${basedir}/lib/attach-1.7.jar commons-cli From 0eb84c0f6f55b72e290a818751ea134202315543 Mon Sep 17 00:00:00 2001 From: kyle Date: Tue, 2 Sep 2025 20:36:51 +0800 Subject: [PATCH 3/3] update version 1.8.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0036fbb..5ee2728 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 GraxCode JByteMod - 1.8.0 + 1.8.3 jar UTF-8