Skip to content

Commit 47e435f

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

File tree

2 files changed

+47
-51
lines changed

2 files changed

+47
-51
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: 23 additions & 21 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
/**
@@ -88,36 +88,31 @@ private Manifest createManifest(String agentClass, String mainClass) {
8888
@SneakyThrows
8989
private void addDependencies(JarOutputStream targetJar, String relocatePrefix) {
9090
String baseName = Opcodes.class.getPackage().getName().replace('.', '/');
91-
addDependency(targetJar, Opcodes.class, baseName, relocatePrefix);
91+
List<String> skipFolder = new ArrayList<>();
92+
skipFolder.add(ClassNode.class.getPackage().getName().replace(".", "/"));
93+
skipFolder.add(Remapper.class.getPackage().getName().replace('.', '/'));
94+
addDependency(targetJar, Opcodes.class, baseName, skipFolder, relocatePrefix);
9295

9396
String jnaBaseName = Platform.class.getPackage().getName().replace('.', '/');
94-
addDependency(targetJar, Platform.class, jnaBaseName, null);
95-
addDependency(targetJar, DesktopWindow.class, jnaBaseName, null);
97+
addDependency(targetJar, Platform.class, jnaBaseName, Collections.emptyList(), null);
98+
addDependency(targetJar, DesktopWindow.class, jnaBaseName, Collections.emptyList(), null);
9699
}
97100

98101
@SneakyThrows
99102
private void addClassesToJar(JarOutputStream targetJar, Map<String, byte[]> bytes, String relocatePrefix) {
100103
String dependencyPackage = Opcodes.class.getPackage().getName();
101104
for (Map.Entry<String, byte[]> entry : bytes.entrySet()) {
102-
addClassEntry(targetJar,
103-
entry.getKey(),
104-
entry.getValue(),
105-
dependencyPackage,
106-
relocatePrefix);
105+
String className = entry.getKey();
106+
byte[] classBytes = entry.getValue();
107+
targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class"));
108+
byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true);
109+
targetJar.write(processedBytes);
110+
targetJar.closeEntry();
107111
}
108112
}
109113

110114
@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) {
115+
public static void addDependency(JarOutputStream targetJar, Class<?> baseClass, String baseName, List<String> skipFolder, String relocatePrefix) {
121116
URL sourceUrl = baseClass.getProtectionDomain().getCodeSource().getLocation();
122117
String sourceUrlString = sourceUrl.toString();
123118
if (sourceUrlString.contains("!BOOT-INF")) {
@@ -141,6 +136,13 @@ public static void addDependency(JarOutputStream targetJar, Class<?> baseClass,
141136
|| entryName.contains("module-info.class")) {
142137
continue;
143138
}
139+
if (!skipFolder.isEmpty()) {
140+
for (String skip : skipFolder) {
141+
if (entryName.startsWith(skip)) {
142+
continue;
143+
}
144+
}
145+
}
144146
if (!entry.isDirectory()) {
145147
try (InputStream entryStream = sourceJar.getInputStream(entry)) {
146148
byte[] bytes = IOUtils.toByteArray(entryStream);

0 commit comments

Comments
 (0)