diff --git a/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/decompiler/utils/DecompilerUtils.java b/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/decompiler/utils/DecompilerUtils.java index 6d7729b4..c4e7cc02 100644 --- a/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/decompiler/utils/DecompilerUtils.java +++ b/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/decompiler/utils/DecompilerUtils.java @@ -15,8 +15,11 @@ import java.io.StringWriter; import java.net.URL; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicLong; +import java.util.jar.Attributes; import java.util.jar.JarFile; +import java.util.jar.Manifest; public class DecompilerUtils { @@ -101,29 +104,59 @@ public class DecompilerUtils { } public static String decompileMainClassFromJarFile(final String jarFilePath) { + // 首先获取Main-Class - List manifests = readManifest2Array(jarFilePath, null); - if (manifests == null || manifests.size() == 0) { - throw new IllegalStateException("MANIFEST.MF not Exist or is Empty !!!"); - } else { - String mainClass = null; - for (String s : manifests) { - String inner = s.trim().replaceAll(" ", ""); - if (inner.startsWith(MAIN_CLASS)) { - mainClass = inner.split(":")[1]; - break; + String mainClass = readMainClassFromJarFile(jarFilePath); + if (mainClass == null) { + throw new IllegalStateException("MANIFEST.MF has not Main-Class !!!"); + } + + // 然后读取MainClass中的内容并进行反编译 + String classPath = mainClass.replaceAll("\\.", "/"); + return decompileJarFile(jarFilePath, classPath, true, null); + } + + public static String readMainClassFromJarFile(final String jarFilePath) { + try { + JarFile jarFile = new JarFile(jarFilePath); + Manifest mf = jarFile.getManifest(); + Attributes mainAttributes = mf.getMainAttributes(); + for (Map.Entry entry : mainAttributes.entrySet()) { + String key = entry.getKey().toString(); + if (key.equalsIgnoreCase(MAIN_CLASS)) { + return entry.getValue().toString(); } } - if (mainClass == null || mainClass.length() == 0) { - throw new IllegalStateException("MANIFEST.MF has not Main-Class !!!"); - } - - // 然后读取MainClass中的内容并进行反编译 - String classPath = mainClass.replaceAll("\\.", "/"); - return decompileJarFile(jarFilePath, classPath, true, null); + } catch (Exception e) { + throw new IllegalStateException(String.format("Find Main-Class Exception %s", e.getMessage())); } + return null; } +// public static String decompileMainClassFromJarFile(final String jarFilePath) { +// // 首先获取Main-Class +// List manifests = readManifest2Array(jarFilePath, null); +// if (manifests == null || manifests.size() == 0) { +// throw new IllegalStateException("MANIFEST.MF not Exist or is Empty !!!"); +// } else { +// String mainClass = null; +// for (String s : manifests) { +// String inner = s.trim().replaceAll(" ", ""); +// if (inner.startsWith(MAIN_CLASS)) { +// mainClass = inner.split(":")[1]; +// break; +// } +// } +// if (mainClass == null || mainClass.length() == 0) { +// throw new IllegalStateException("MANIFEST.MF has not Main-Class !!!"); +// } +// +// // 然后读取MainClass中的内容并进行反编译 +// String classPath = mainClass.replaceAll("\\.", "/"); +// return decompileJarFile(jarFilePath, classPath, true, null); +// } +// } + public static String decompileJarFile(final String jarFilePath, final String source, final boolean isClass, final String charSet) { // 对于Class文件和非Class文件处理方式不同 diff --git a/source/utils/utils-common/src/test/java/test/my/utils/DecompilerUtilsTest.java b/source/utils/utils-common/src/test/java/test/my/utils/DecompilerUtilsTest.java new file mode 100644 index 00000000..71d83608 --- /dev/null +++ b/source/utils/utils-common/src/test/java/test/my/utils/DecompilerUtilsTest.java @@ -0,0 +1,25 @@ +package test.my.utils; + +import com.jd.blockchain.utils.decompiler.utils.DecompilerUtils; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class DecompilerUtilsTest { + + private String testJarName = "contract-JDChain-Contract.jar"; + + private String testJarMainClass = "com.jd.jr.contract.service.impl.Test031111621550409227472896ContractImpl"; + + @Test + public void testMainClassFromJarFile() throws Exception { + // 获取需要测试的jar包 + String path = DecompilerUtilsTest.class.getResource("/").toURI().getPath() + testJarName; + + String mainClass = DecompilerUtils.readMainClassFromJarFile(path); + + System.out.println("find main class = " + mainClass); + + assertEquals(mainClass, testJarMainClass); + } +} diff --git a/source/utils/utils-common/src/test/resources/contract-JDChain-Contract.jar b/source/utils/utils-common/src/test/resources/contract-JDChain-Contract.jar new file mode 100644 index 00000000..ec1e54c8 Binary files /dev/null and b/source/utils/utils-common/src/test/resources/contract-JDChain-Contract.jar differ