以下是Java获取解析Jar包,获取MainClass以及属性配置的工具类,代码如下:
import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.Manifest; /** * jar包解析器 * * @author : YangLinWei * @createTime: 2022/8/29 12:51 下午 * @version: 1.0.0 */ public class JarAnalyzer { /** * jar 文件路径 */ private String jarFilePath; /** * 构造函数 * * @param jarFilePath 文件路径 */ public jarAnalyzer(String jarFilePath) { this.jarFilePath = jarFilePath; } /** * 获取jar包属性 * * @return jar包所有属性 * @throws IOException */ public Map<String, String> getJarAttrs() throws IOException { URL url = new File(this.jarFilePath).toURI().toURL(); URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}); URL manifestUrl = urlClassLoader.findResource("META-INF/MANIFEST.MF"); Manifest manifest = new Manifest(manifestUrl.openStream()); Attributes mainAttributes = manifest.getMainAttributes(); Map<String, String> attrs = new HashMap<>(); mainAttributes.forEach((key, value) -> { attrs.put(String.valueOf(key), String.valueOf(value)); }); return attrs; } /** * 获取入口类全路径名 * * @return 入口类全路径名 * @throws IOException */ public String getProgamClass() throws IOException { for (String key : getJarAttrs().keySet()) { if ("program-class".equals(key)) { return getJarAttrs().get(key); } } return null; } /** * 获取jar包所有类名 * * @return jar包所有类名 * @throws IOException */ public Set<String> getAllClasses() throws IOException { File givenFile = new File(this.jarFilePath); Set<String> classNames = new HashSet<>(); try (JarFile jarFile = new JarFile(givenFile)) { Enumeration<JarEntry> e = jarFile.entries(); while (e.hasMoreElements()) { JarEntry jarEntry = e.nextElement(); if (jarEntry.getName().endsWith(".class")) { String className = jarEntry.getName() .replace("/", ".") .replace(".class", ""); classNames.add(className); } } return classNames; } } }
单元测试代码:
public static void main(String[] args) throws Exception { String jarPath = "/xxx/TopSpeedWindowing.jar"; JarAnalyzer jarAnalyzer = new JarAnalyzer(jarPath); log.info("jar包所有属性:"); jarAnalyzer.getJarAttrs().forEach((key, value) -> { log.info("key={},value={}", key, value); }); log.info("MainClass -> {}", jarAnalyzer.getProgamClass()); log.info("jar包含有的类:"); jarAnalyzer.getAllClasses().forEach(clzz -> { log.info("className ->{}", clzz); }); }
测试解析结果:
参考文献: