簡體   English   中英

如何以編程方式獲取 Java class 依賴項列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM