Skip to content

Commit 460cc9f

Browse files
committed
fix: add too many dependencies in fatjar
1 parent 9190a87 commit 460cc9f

File tree

2 files changed

+46
-55
lines changed

2 files changed

+46
-55
lines changed

packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJDKAttacherPacker.java

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import org.apache.commons.io.IOUtils;
1010
import org.apache.commons.lang3.StringUtils;
1111
import org.objectweb.asm.Opcodes;
12+
import org.objectweb.asm.commons.Remapper;
13+
import org.objectweb.asm.tree.ClassNode;
1214

1315
import java.io.ByteArrayOutputStream;
1416
import java.io.File;
@@ -44,7 +46,7 @@ public byte[] packBytes(JarPackerConfig jarPackerConfig) {
4446
classes.putAll(virtualMachineClasses);
4547
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
4648
try (JarOutputStream targetJar = new JarOutputStream(outputStream, manifest)) {
47-
addDependencies(targetJar, relocatePrefix);
49+
addAsmDependencies(targetJar, relocatePrefix);
4850
addClassesToJar(targetJar, jarPackerConfig.getClassBytes(), relocatePrefix);
4951
for (Map.Entry<String, byte[]> entry : classes.entrySet()) {
5052
String className = entry.getKey();
@@ -70,35 +72,11 @@ private Manifest createManifest(String agentClass, String mainClass) {
7072
}
7173

7274
@SneakyThrows
73-
private void addDependencies(JarOutputStream targetJar, String relocatePrefix) {
75+
private void addAsmDependencies(JarOutputStream targetJar, String relocatePrefix) {
7476
String baseName = Opcodes.class.getPackage().getName().replace('.', '/');
75-
addDependency(targetJar, Opcodes.class, baseName, relocatePrefix);
76-
}
77-
78-
@SneakyThrows
79-
private void addClassesToJar(JarOutputStream targetJar, Map<String, byte[]> bytes, String relocatePrefix) {
80-
String dependencyPackage = Opcodes.class.getPackage().getName();
81-
for (Map.Entry<String, byte[]> entry : bytes.entrySet()) {
82-
addClassEntry(targetJar,
83-
entry.getKey(),
84-
entry.getValue(),
85-
dependencyPackage,
86-
relocatePrefix);
87-
}
88-
}
89-
90-
@SneakyThrows
91-
private void addClassEntry(JarOutputStream targetJar, String className, byte[] classBytes,
92-
String dependencyPackage, String relocatePrefix) {
93-
targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class"));
94-
byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true);
95-
targetJar.write(processedBytes);
96-
targetJar.closeEntry();
97-
}
98-
99-
@SneakyThrows
100-
public static void addDependency(JarOutputStream targetJar, Class<?> baseClass, String baseName, String relocatePrefix) {
101-
URL sourceUrl = baseClass.getProtectionDomain().getCodeSource().getLocation();
77+
String commonBaseName = Remapper.class.getPackage().getName().replace('.', '/');
78+
String treeBaseName = ClassNode.class.getPackage().getName().replace('.', '/');
79+
URL sourceUrl = Opcodes.class.getProtectionDomain().getCodeSource().getLocation();
10280
String sourceUrlString = sourceUrl.toString();
10381
if (sourceUrlString.contains("!BOOT-INF")) {
10482
String path = sourceUrlString.substring("jar:nested:".length());
@@ -118,7 +96,10 @@ public static void addDependency(JarOutputStream targetJar, Class<?> baseClass,
11896
JarEntry entry = entries.nextElement();
11997
String entryName = entry.getName();
12098
if (entryName.equals("META-INF/MANIFEST.MF")
121-
|| entryName.contains("module-info.class")) {
99+
|| entryName.contains("module-info.class")
100+
|| !entryName.startsWith(baseName)
101+
|| entryName.startsWith(commonBaseName)
102+
|| entryName.startsWith(treeBaseName)) {
122103
continue;
123104
}
124105
if (!entry.isDirectory()) {
@@ -144,6 +125,19 @@ public static void addDependency(JarOutputStream targetJar, Class<?> baseClass,
144125
}
145126
}
146127

128+
@SneakyThrows
129+
private void addClassesToJar(JarOutputStream targetJar, Map<String, byte[]> bytes, String relocatePrefix) {
130+
String dependencyPackage = Opcodes.class.getPackage().getName();
131+
for (Map.Entry<String, byte[]> entry : bytes.entrySet()) {
132+
String className = entry.getKey();
133+
byte[] classBytes = entry.getValue();
134+
targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class"));
135+
byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true);
136+
targetJar.write(processedBytes);
137+
targetJar.closeEntry();
138+
}
139+
}
140+
147141
/**
148142
* Extracts a JAR file to a temporary directory
149143
*

packer/src/main/java/com/reajason/javaweb/packer/jar/AgentJarWithJREAttacherPacker.java

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.apache.commons.io.IOUtils;
1212
import org.apache.commons.lang3.StringUtils;
1313
import org.objectweb.asm.Opcodes;
14+
import org.objectweb.asm.commons.Remapper;
15+
import org.objectweb.asm.tree.ClassNode;
1416

1517
import java.io.ByteArrayOutputStream;
1618
import java.io.File;
@@ -19,9 +21,7 @@
1921
import java.net.URL;
2022
import java.nio.file.Files;
2123
import java.nio.file.Path;
22-
import java.util.Enumeration;
23-
import java.util.HashMap;
24-
import java.util.Map;
24+
import java.util.*;
2525
import java.util.jar.*;
2626

2727
/**
@@ -87,37 +87,30 @@ private Manifest createManifest(String agentClass, String mainClass) {
8787

8888
@SneakyThrows
8989
private void addDependencies(JarOutputStream targetJar, String relocatePrefix) {
90-
String baseName = Opcodes.class.getPackage().getName().replace('.', '/');
91-
addDependency(targetJar, Opcodes.class, baseName, relocatePrefix);
92-
93-
String jnaBaseName = Platform.class.getPackage().getName().replace('.', '/');
94-
addDependency(targetJar, Platform.class, jnaBaseName, null);
95-
addDependency(targetJar, DesktopWindow.class, jnaBaseName, null);
90+
List<String> skipFolder = new ArrayList<>();
91+
skipFolder.add(ClassNode.class.getPackage().getName().replace(".", "/"));
92+
skipFolder.add(Remapper.class.getPackage().getName().replace('.', '/'));
93+
addDependency(targetJar, Opcodes.class, skipFolder, relocatePrefix);
94+
addDependency(targetJar, Platform.class, Collections.singletonList(DesktopWindow.class.getPackage().getName().replace(".", "/")), null);
95+
addDependency(targetJar, DesktopWindow.class, Collections.emptyList(), null);
9696
}
9797

9898
@SneakyThrows
9999
private void addClassesToJar(JarOutputStream targetJar, Map<String, byte[]> bytes, String relocatePrefix) {
100100
String dependencyPackage = Opcodes.class.getPackage().getName();
101101
for (Map.Entry<String, byte[]> entry : bytes.entrySet()) {
102-
addClassEntry(targetJar,
103-
entry.getKey(),
104-
entry.getValue(),
105-
dependencyPackage,
106-
relocatePrefix);
102+
String className = entry.getKey();
103+
byte[] classBytes = entry.getValue();
104+
targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class"));
105+
byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true);
106+
targetJar.write(processedBytes);
107+
targetJar.closeEntry();
107108
}
108109
}
109110

110111
@SneakyThrows
111-
private void addClassEntry(JarOutputStream targetJar, String className, byte[] classBytes,
112-
String dependencyPackage, String relocatePrefix) {
113-
targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class"));
114-
byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true);
115-
targetJar.write(processedBytes);
116-
targetJar.closeEntry();
117-
}
118-
119-
@SneakyThrows
120-
public static void addDependency(JarOutputStream targetJar, Class<?> baseClass, String baseName, String relocatePrefix) {
112+
public static void addDependency(JarOutputStream targetJar, Class<?> baseClass, List<String> skipFolder, String relocatePrefix) {
113+
String baseName = baseClass.getPackage().getName().replace('.', '/');
121114
URL sourceUrl = baseClass.getProtectionDomain().getCodeSource().getLocation();
122115
String sourceUrlString = sourceUrl.toString();
123116
if (sourceUrlString.contains("!BOOT-INF")) {
@@ -138,7 +131,11 @@ public static void addDependency(JarOutputStream targetJar, Class<?> baseClass,
138131
JarEntry entry = entries.nextElement();
139132
String entryName = entry.getName();
140133
if (entryName.startsWith("META-INF")
141-
|| entryName.contains("module-info.class")) {
134+
|| entryName.contains("module-info.class")
135+
|| !entryName.startsWith(baseName)) {
136+
continue;
137+
}
138+
if (skipFolder.stream().anyMatch(entryName::startsWith)) {
142139
continue;
143140
}
144141
if (!entry.isDirectory()) {

0 commit comments

Comments
 (0)