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<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);
});
}
测试解析结果
参考文献:
https://stackoverflow.com/questions/1272648/reading-my-own-jars-manifest
https://www.baeldung.com/jar-file-get-class-names