|
|
@@ -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");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|