我想列出通过maven项目构建创建的jar文件的所有依赖项。我怎样才能在java中实现这一点?我通过maven命令mvn:dependency
知道它,但我想以编程方式进行...
任何帮助?
答案 0 :(得分:0)
一般来说,这很难。你能做什么:
抓住jar的pom.xml,将其放入一个空目录并调用" mvn dependency:list"通过ProcessBuilder。解析结果,您有一个依赖项列表。但是,如果pom.xml不能被解释为独立项目的pom(例如,如果它是多模块构建的一部分),则可能会失败。
尝试使用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);
}