Skip to content

Commit dc22c5e

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

File tree

2 files changed

+49
-67
lines changed

2 files changed

+49
-67
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: 25 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
import com.reajason.javaweb.packer.JarPackerConfig;
66
import com.reajason.javaweb.packer.jar.attach.Attacher;
77
import com.reajason.javaweb.packer.jar.attach.VirtualMachine;
8-
import com.sun.jna.Platform;
9-
import com.sun.jna.platform.DesktopWindow;
108
import lombok.SneakyThrows;
119
import org.apache.commons.io.IOUtils;
1210
import org.apache.commons.lang3.StringUtils;
1311
import org.objectweb.asm.Opcodes;
12+
import org.objectweb.asm.commons.Remapper;
13+
import org.objectweb.asm.tree.ClassNode;
1414

1515
import java.io.ByteArrayOutputStream;
1616
import java.io.File;
@@ -46,7 +46,7 @@ public byte[] packBytes(JarPackerConfig jarPackerConfig) {
4646
classes.putAll(virtualMachineClasses);
4747
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
4848
try (JarOutputStream targetJar = new JarOutputStream(outputStream, manifest)) {
49-
addDependencies(targetJar, relocatePrefix);
49+
addAsmDependencies(targetJar, relocatePrefix);
5050
addClassesToJar(targetJar, jarPackerConfig.getClassBytes(), relocatePrefix);
5151
for (Map.Entry<String, byte[]> entry : classes.entrySet()) {
5252
String className = entry.getKey();
@@ -86,39 +86,11 @@ private Manifest createManifest(String agentClass, String mainClass) {
8686
}
8787

8888
@SneakyThrows
89-
private void addDependencies(JarOutputStream targetJar, String relocatePrefix) {
89+
private void addAsmDependencies(JarOutputStream targetJar, String relocatePrefix) {
9090
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);
96-
}
97-
98-
@SneakyThrows
99-
private void addClassesToJar(JarOutputStream targetJar, Map<String, byte[]> bytes, String relocatePrefix) {
100-
String dependencyPackage = Opcodes.class.getPackage().getName();
101-
for (Map.Entry<String, byte[]> entry : bytes.entrySet()) {
102-
addClassEntry(targetJar,
103-
entry.getKey(),
104-
entry.getValue(),
105-
dependencyPackage,
106-
relocatePrefix);
107-
}
108-
}
109-
110-
@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) {
121-
URL sourceUrl = baseClass.getProtectionDomain().getCodeSource().getLocation();
91+
String commonBaseName = Remapper.class.getPackage().getName().replace('.', '/');
92+
String treeBaseName = ClassNode.class.getPackage().getName().replace('.', '/');
93+
URL sourceUrl = Opcodes.class.getProtectionDomain().getCodeSource().getLocation();
12294
String sourceUrlString = sourceUrl.toString();
12395
if (sourceUrlString.contains("!BOOT-INF")) {
12496
String path = sourceUrlString.substring("jar:nested:".length());
@@ -137,8 +109,11 @@ public static void addDependency(JarOutputStream targetJar, Class<?> baseClass,
137109
while (entries.hasMoreElements()) {
138110
JarEntry entry = entries.nextElement();
139111
String entryName = entry.getName();
140-
if (entryName.startsWith("META-INF")
141-
|| entryName.contains("module-info.class")) {
112+
if (entryName.equals("META-INF/MANIFEST.MF")
113+
|| entryName.contains("module-info.class")
114+
|| !entryName.startsWith(baseName)
115+
|| entryName.startsWith(commonBaseName)
116+
|| entryName.startsWith(treeBaseName)) {
142117
continue;
143118
}
144119
if (!entry.isDirectory()) {
@@ -164,6 +139,19 @@ public static void addDependency(JarOutputStream targetJar, Class<?> baseClass,
164139
}
165140
}
166141

142+
@SneakyThrows
143+
private void addClassesToJar(JarOutputStream targetJar, Map<String, byte[]> bytes, String relocatePrefix) {
144+
String dependencyPackage = Opcodes.class.getPackage().getName();
145+
for (Map.Entry<String, byte[]> entry : bytes.entrySet()) {
146+
String className = entry.getKey();
147+
byte[] classBytes = entry.getValue();
148+
targetJar.putNextEntry(new JarEntry(className.replace('.', '/') + ".class"));
149+
byte[] processedBytes = ClassBytesShrink.shrink(ClassRenameUtils.relocateClass(classBytes, dependencyPackage, relocatePrefix + dependencyPackage), true);
150+
targetJar.write(processedBytes);
151+
targetJar.closeEntry();
152+
}
153+
}
154+
167155
/**
168156
* Extracts a JAR file to a temporary directory
169157
*

0 commit comments

Comments
 (0)