From 3f064340acc2d7d24b7fa3c851d2fcfaf183a5e7 Mon Sep 17 00:00:00 2001 From: shaozhuguang Date: Wed, 18 Mar 2020 15:18:24 +0800 Subject: [PATCH] fix read main-class exception from contract jar --- .../decompiler/utils/DecompilerUtils.java | 67 +++++++++++++----- .../test/my/utils/DecompilerUtilsTest.java | 25 +++++++ .../resources/contract-JDChain-Contract.jar | Bin 0 -> 6723 bytes 3 files changed, 75 insertions(+), 17 deletions(-) create mode 100644 source/utils/utils-common/src/test/java/test/my/utils/DecompilerUtilsTest.java create mode 100644 source/utils/utils-common/src/test/resources/contract-JDChain-Contract.jar 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 0000000000000000000000000000000000000000..ec1e54c8dbdcfcdacae7895c798611d7e2bb5f24 GIT binary patch literal 6723 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 literal 0 HcmV?d00001