fix: add too many dependencies in fatjar

This commit is contained in:
ReaJason
2025-09-12 22:51:50 +08:00
parent 44abb44670
commit c272a5387d
2 changed files with 46 additions and 55 deletions
@@ -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<String, byte[]> 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<String, byte[]> bytes, String relocatePrefix) {
String dependencyPackage = Opcodes.class.getPackage().getName();
for (Map.Entry<String, byte[]> 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<String, byte[]> bytes, String relocatePrefix) {
String dependencyPackage = Opcodes.class.getPackage().getName();
for (Map.Entry<String, byte[]> 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
*
@@ -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<String> 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<String, byte[]> bytes, String relocatePrefix) {
String dependencyPackage = Opcodes.class.getPackage().getName();
for (Map.Entry<String, byte[]> 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<String> 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()) {