55import com .reajason .javaweb .packer .JarPackerConfig ;
66import com .reajason .javaweb .packer .jar .attach .Attacher ;
77import com .reajason .javaweb .packer .jar .attach .VirtualMachine ;
8- import com .sun .jna .Platform ;
9- import com .sun .jna .platform .DesktopWindow ;
108import lombok .SneakyThrows ;
119import org .apache .commons .io .IOUtils ;
1210import org .apache .commons .lang3 .StringUtils ;
1311import org .objectweb .asm .Opcodes ;
12+ import org .objectweb .asm .commons .Remapper ;
13+ import org .objectweb .asm .tree .ClassNode ;
1414
1515import java .io .ByteArrayOutputStream ;
1616import 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