diff --git a/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJDKAttacherPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJDKAttacherPacker.java index fff0fcb5..ca688dd2 100644 --- a/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJDKAttacherPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJDKAttacherPacker.java @@ -9,6 +9,8 @@ import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.commons.Remapper; +import org.objectweb.asm.tree.ClassNode; import java.io.ByteArrayOutputStream; import java.io.File; @@ -44,7 +46,7 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker { classes.putAll(virtualMachineClasses); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try (JarOutputStream targetJar = new JarOutputStream(outputStream, manifest)) { - addDependencies(targetJar, relocatePrefix); + addAsmDependencies(targetJar, relocatePrefix); addClassesToJar(targetJar, jarPackerConfig.getClassBytes(), relocatePrefix); for (Map.Entry entry : classes.entrySet()) { String className = entry.getKey(); @@ -70,35 +72,11 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker { } @SneakyThrows - private void addDependencies(JarOutputStream targetJar, String relocatePrefix) { + private void addAsmDependencies(JarOutputStream targetJar, String relocatePrefix) { String baseName = Opcodes.class.getPackage().getName().replace('.', '/'); - addDependency(targetJar, Opcodes.class, baseName, relocatePrefix); - } - - @SneakyThrows - private void addClassesToJar(JarOutputStream targetJar, Map bytes, String relocatePrefix) { - String dependencyPackage = Opcodes.class.getPackage().getName(); - for (Map.Entry entry : bytes.entrySet()) { - addClassEntry(targetJar, - entry.getKey(), - entry.getValue(), - dependencyPackage, - relocatePrefix); - } - } - - @SneakyThrows - private void addClassEntry(JarOutputStream targetJar, String className, byte[] classBytes, - String dependencyPackage, String relocatePrefix) { - targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class")); - byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true); - targetJar.write(processedBytes); - targetJar.closeEntry(); - } - - @SneakyThrows - public static void addDependency(JarOutputStream targetJar, Class baseClass, String baseName, String relocatePrefix) { - URL sourceUrl = baseClass.getProtectionDomain().getCodeSource().getLocation(); + String commonBaseName = Remapper.class.getPackage().getName().replace('.', '/'); + String treeBaseName = ClassNode.class.getPackage().getName().replace('.', '/'); + URL sourceUrl = Opcodes.class.getProtectionDomain().getCodeSource().getLocation(); String sourceUrlString = sourceUrl.toString(); if (sourceUrlString.contains("!BOOT-INF")) { String path = sourceUrlString.substring("jar:nested:".length()); @@ -118,7 +96,10 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker { JarEntry entry = entries.nextElement(); String entryName = entry.getName(); if (entryName.equals("META-INF/MANIFEST.MF") - || entryName.contains("module-info.class")) { + || entryName.contains("module-info.class") + || !entryName.startsWith(baseName) + || entryName.startsWith(commonBaseName) + || entryName.startsWith(treeBaseName)) { continue; } if (!entry.isDirectory()) { @@ -144,6 +125,19 @@ public class AgentJarWithJDKAttacherPacker implements JarPacker { } } + @SneakyThrows + private void addClassesToJar(JarOutputStream targetJar, Map bytes, String relocatePrefix) { + String dependencyPackage = Opcodes.class.getPackage().getName(); + for (Map.Entry entry : bytes.entrySet()) { + String className = entry.getKey(); + byte[] classBytes = entry.getValue(); + targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class")); + byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true); + targetJar.write(processedBytes); + targetJar.closeEntry(); + } + } + /** * Extracts a JAR file to a temporary directory * diff --git a/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJREAttacherPacker.java b/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJREAttacherPacker.java index 5d8754ff..d2919b9c 100644 --- a/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJREAttacherPacker.java +++ b/packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJREAttacherPacker.java @@ -11,6 +11,8 @@ import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.commons.Remapper; +import org.objectweb.asm.tree.ClassNode; import java.io.ByteArrayOutputStream; import java.io.File; @@ -19,9 +21,7 @@ import java.io.InputStream; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.jar.*; /** @@ -87,37 +87,30 @@ public class AgentJarWithJREAttacherPacker implements JarPacker { @SneakyThrows private void addDependencies(JarOutputStream targetJar, String relocatePrefix) { - String baseName = Opcodes.class.getPackage().getName().replace('.', '/'); - addDependency(targetJar, Opcodes.class, baseName, relocatePrefix); - - String jnaBaseName = Platform.class.getPackage().getName().replace('.', '/'); - addDependency(targetJar, Platform.class, jnaBaseName, null); - addDependency(targetJar, DesktopWindow.class, jnaBaseName, null); + List skipFolder = new ArrayList<>(); + skipFolder.add(ClassNode.class.getPackage().getName().replace(".", "/")); + skipFolder.add(Remapper.class.getPackage().getName().replace('.', '/')); + addDependency(targetJar, Opcodes.class, skipFolder, relocatePrefix); + addDependency(targetJar, Platform.class, Collections.singletonList(DesktopWindow.class.getPackage().getName().replace(".", "/")), null); + addDependency(targetJar, DesktopWindow.class, Collections.emptyList(), null); } @SneakyThrows private void addClassesToJar(JarOutputStream targetJar, Map bytes, String relocatePrefix) { String dependencyPackage = Opcodes.class.getPackage().getName(); for (Map.Entry entry : bytes.entrySet()) { - addClassEntry(targetJar, - entry.getKey(), - entry.getValue(), - dependencyPackage, - relocatePrefix); + String className = entry.getKey(); + byte[] classBytes = entry.getValue(); + targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class")); + byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true); + targetJar.write(processedBytes); + targetJar.closeEntry(); } } @SneakyThrows - private void addClassEntry(JarOutputStream targetJar, String className, byte[] classBytes, - String dependencyPackage, String relocatePrefix) { - targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class")); - byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true); - targetJar.write(processedBytes); - targetJar.closeEntry(); - } - - @SneakyThrows - public static void addDependency(JarOutputStream targetJar, Class baseClass, String baseName, String relocatePrefix) { + public static void addDependency(JarOutputStream targetJar, Class baseClass, List skipFolder, String relocatePrefix) { + String baseName = baseClass.getPackage().getName().replace('.', '/'); URL sourceUrl = baseClass.getProtectionDomain().getCodeSource().getLocation(); String sourceUrlString = sourceUrl.toString(); if (sourceUrlString.contains("!BOOT-INF")) { @@ -138,7 +131,11 @@ public class AgentJarWithJREAttacherPacker implements JarPacker { JarEntry entry = entries.nextElement(); String entryName = entry.getName(); if (entryName.startsWith("META-INF") - || entryName.contains("module-info.class")) { + || entryName.contains("module-info.class") + || !entryName.startsWith(baseName)) { + continue; + } + if (skipFolder.stream().anyMatch(entryName::startsWith)) { continue; } if (!entry.isDirectory()) {