[英]How to get a list of Java class dependencies programmatically
本質上,我在問類似這樣的問題: 如何獲取主要 class 的 Java class 依賴項列表? 但我想用 Java API 來做。 我不想執行jdeps
並刮掉 output。
如果它使用https://github.com/classgraph/classgraph ,則加分,因為我們的項目已經使用了該庫,並且它非常適合在不實際實例化它處理的所有內容的情況下掃描類。
哦,這將僅限於在 JDK 8 上工作。
[更新]
這里有一點背景。 假設我有一個捆綁的應用程序。 也許是 Spring Boot 應用程序或可以部署到 Cloud Foundry 或 Heroku 等雲平台的東西。 該應用程序可能包含框架 jars(如 Spring)、實用程序 jars(日志記錄、模板、json/xml 處理等)、應用程序域類以及所有必要的傳遞依賴項。 假設這全部都捆綁到 uber-jar 中或通過類路徑引用。
我的用例是:給定一個 class 和 uber-jar/classpath,我給定的 class 的子集(在那個 uber-jar 之外)是什么?
事實證明,我可以用classgraph
做我想做的事。 關鍵是設置enableInterClassDependencies
。 給定 class,以下將處理該 class 的所有依賴項,並確定哪些 jars 包含相關的依賴類:
import java.net.URI;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfo;
import io.github.classgraph.ClassInfoList;
import io.github.classgraph.ScanResult;
public class DependencyFinder {
private final String clazz;
public DependencyFinder(String clazz) {
this.clazz = clazz;
}
public Set<URI> process() {
ScanResult scanResult = new ClassGraph()
.whitelistPackages()
.enableInterClassDependencies()
.scan();
ClassInfo rootClass = scanResult.getClassInfo(clazz);
Map<ClassInfo, ClassInfoList> dependencyMap = scanResult.getClassDependencyMap();
Set<URI> results = new HashSet<>();
Set<ClassInfo> seen = new HashSet<>();
accumulateJars(new HashSet<>(dependencyMap.get(rootClass)), dependencyMap, results, seen);
return results;
}
private void accumulateJars(Set<ClassInfo> roots, Map<ClassInfo, ClassInfoList> dependencies, Set<URI> accumulated, Set<ClassInfo> seen) {
Set<ClassInfo> nextRoots = new HashSet<>();
for (ClassInfo info : roots) {
if (seen.contains(info)) {
continue;
}
accumulated.add(info.getClasspathElementURI());
seen.add(info);
nextRoots.addAll(dependencies.get(info));
}
if (nextRoots.size() > 0) {
accumulateJars(nextRoots, dependencies, accumulated, seen);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.