如何获取Jar依赖列表

时间:2017-07-21 09:53:52

标签: java maven maven-plugin

我想列出通过maven项目构建创建的jar文件的所有依赖项。我怎样才能在java中实现这一点?我通过maven命令mvn:dependency知道它,但我想以编程方式进行... 任何帮助?

2 个答案:

答案 0 :(得分:0)

一般来说,这很难。你能做什么:

  1. 抓住jar的pom.xml,将其放入一个空目录并调用" mvn dependency:list"通过ProcessBuilder。解析结果,您有一个依赖项列表。但是,如果pom.xml不能被解释为独立项目的pom(例如,如果它是多模块构建的一部分),则可能会失败。

  2. 尝试使用Aether来确定依赖项列表,而不是使用ProcessBuilder。潜在的问题与上述相同。

答案 1 :(得分:0)

以下强力方法可以成功获得所有依赖(第三方)罐子的绝对路径。替换' FileUtils.getFileListRecursively'和' FileUtils.readLines'用你自己的方法。

FileUtils.getFileListRecursively("src")

从'src'中读取绝对文件路径。当前java项目的文件夹,以及

FileUtils.readLines(filePath)

将文件作为文本文件读取,并将所有行作为字符串的ArrayList返回。

    HashSet<String> jarLocationsSet = new HashSet<>();

    final String importString = "import ";
    final String javaString = "java";
    ArrayList<String> fileList = FileUtils.getFileListRecursively("src");
    for (String filePath : fileList) {
        if (filePath.endsWith(javaString) == false){
            continue;
        }
        List<String> lines = FileUtils.readLines(filePath);

        for (String line : lines) {

            int isecl = line.indexOf(';');
            if (line.contains(importString) == false || isecl < 0){
                continue;
            }
            if (line.contains("static")){
                continue;
            }
            int start = line.indexOf(importString);
            line = line.substring(start + importString.length(), isecl);
            if (line.startsWith(javaString)){
                continue;
            }
            Class<?> clazz = null;
            try {
                clazz = Class.forName(line, false, ClassLoader.getSystemClassLoader());
            } catch (Exception e) {
            }
            if (clazz == null){
                continue;
            }


            URL location = clazz.getResource('/'+clazz.getName().replace('.', '/') + ".class");
            String locationString = location.toString();
            int jarIndex= locationString.indexOf(".jar");
            if (jarIndex < 0){
                continue;
            }
            locationString = locationString.substring(0, jarIndex + 4);
            jarLocationsSet.add(locationString);
        }

    }


    for (String jarLocation : jarLocationsSet) {
        System.out.println("jarLocation = " + jarLocation);
    }