Java提供了读写jar的类库Java.util.jar,Java获取解析jar包的工具类如下:
- 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包解析器
- *
- */
- public class JarAnalyzer {
-
- /**
- * jar 文件路径
- */
- private String jarFilePath;
-
- /**
- * 构造函数
- *
- * @param jarFilePath 文件路径
- */
- public jarAnalyzer(String jarFilePath) {
- this.jarFilePath = jarFilePath;
- }
-
- /**
- * 获取jar包属性
- *
- * @return jar包所有属性
- * @throws IOException
- */
- public Map
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
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
getAllClasses() throws IOException { - File givenFile = new File(this.jarFilePath);
- Set
classNames = new HashSet<>(); - try (JarFile jarFile = new JarFile(givenFile)) {
- Enumeration
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);
- });
- }
测试解析结果

参考文献:
https://stackoverflow.com/questions/1272648/reading-my-own-jars-manifest
https://www.baeldung.com/jar-file-get-class-names