Prechádzať zdrojové kódy

fix 启动类名超过一行时添加Premain-Class截断主类名问题

wangshm02 3 mesiacov pred
rodič
commit
bfe4854bb3

+ 23 - 15
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/executor/EncryptExecutor.java

@@ -31,13 +31,10 @@ import winter.com.ideaaedi.classwinter.util.PathUtil;
 import winter.com.ideaaedi.classwinter.util.SimpleFileOrderSupport;
 import winter.com.ideaaedi.classwinter.util.StrUtil;
 
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.StringReader;
+import java.io.*;
 import java.lang.reflect.UndeclaredThrowableException;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -52,6 +49,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.jar.Manifest;
 import java.util.stream.Collectors;
 
 /**
@@ -739,20 +737,30 @@ public class EncryptExecutor {
         }
         
         // 把javaagent信息加入到MANIFEST.MF
-        File manifest = new File(this.targetRootDir, "META-INF/MANIFEST.MF");
-        String preMain = Constant.PREMAIN_CLASS + Reverses.class.getName();
-        String[] origin = {};
-        if (manifest.exists()) {
-            String originContent = IOUtil.readContentFromFile(manifest);
-            if (!StrUtil.isBlank(originContent) && originContent.contains(Constant.PREMAIN_CLASS)) {
+        File manifestFile = new File(this.targetRootDir, "META-INF/MANIFEST.MF");
+        String preMain = Reverses.class.getName();
+        Manifest originManifest = new Manifest();
+        if (manifestFile.exists()) {
+            try (InputStream inputStream = Files.newInputStream(manifestFile.toPath())){
+                originManifest.read(inputStream);
+            }
+            catch (IOException e) {
+                throw new ClassWinterException(this.originJarOrWar + " can't read META-INF/MANIFEST.MF");
+            }
+            if (originManifest.getMainAttributes().containsKey("Premain-Class")) {
                 throw new ClassWinterException(this.originJarOrWar + " already exist Premain-Class at META-INF/MANIFEST.MF");
             }
-            origin = originContent.split(System.lineSeparator());
         }
         // 在原来的启动函数行后面,插入pre-main指令
-        String str = StrUtil.insertStrAfterLine(origin, preMain, "Main-Class:");
-        str = str + System.lineSeparator();
-        IOUtil.writeContentToFile(str, manifest);
+        originManifest.getMainAttributes().putValue("Premain-Class", preMain);
+        if (!manifestFile.getParentFile().exists()){
+            manifestFile.getParentFile().mkdirs();
+        }
+        try (OutputStream outputStream = Files.newOutputStream(manifestFile.toPath())){
+            originManifest.write(outputStream);
+        } catch (IOException e) {
+            throw new ClassWinterException(this.originJarOrWar + " can't write Premain-Class to META-INF/MANIFEST.MF");
+        }
     }
     
     /**