以编程方式列出包含的Java库

时间:2017-10-19 18:39:51

标签: java intellij-idea ant

我正在开发一个利用许多安全/实用程序库的项目。出于安全原因,我希望能够告知用户我们使用哪些库以及他们的bin中运行的版本。我们的许多用户都选择修改我们的代码,所以我希望以编程方式这样做。

我试图解析类路径,但是当程序打包到jar中时似乎没什么帮助。我也尝试列出JAR中的所有类名,但这并没有传达任何版本信息。

我们所有的lib都有jar文件名的版本。我打算制作某种编译时脚本。我们使用ant和intellij构建。 Ant是我唯一需要支持的人,intellij让生活更轻松。

2 个答案:

答案 0 :(得分:0)

如果jar在类路径中,您可以使用系统属性来获取jar。

  String path = System.getProperty("java.class.path");
  String[] p;
  p = path.split(";");
  for(int i=0; i< p.length; i++) {
      System.out.println(p[i]);
  }

上面的示例是我以前用来从服务器返回所有Web应用程序库的内容。你可以做类似的事情来获得你想要的罐子。

如果你将它们打包成jar,那么你需要从类目录中加载它,你可以尝试使用classloader。

 ClassLoader loader = ClassLoader.getSystemClassLoader();
 URL[] urls = ((URLClassLoader)loader).getURLs();
 for(URL url: urls){
    System.out.println(url.getFile());
 }

答案 1 :(得分:0)

我能够通过解析META-INF / maven / org / blah / pom.properties文件来做到这一点。它仅适用于具有maven支持的库(尽管您的项目不需要任何与maven相关的内容)。

private static HashMap<String,String> getVersionMap () {
    //Results by <lib name, version>
    final HashMap<String,String> resultMap = new HashMap<>();
    try {
        //Hack to get a ref to our jar
        URI jarLocation = new URI("jar:" + SecurityInfo.class.getProtectionDomain().getCodeSource().getLocation().toString());
        //This jdk1.7x nio util lets us look into the jar, without it we would need ZipStream
        FileSystem fs = FileSystems.newFileSystem(jarLocation, new HashMap<String,String>());

        Files.walkFileTree(fs.getPath("/META-INF/maven"), new HashSet<FileVisitOption>(), 3, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                if (file.toString().endsWith(".properties")) {
                    try {
                        List<String> data = Files.readAllLines(file, Charset.defaultCharset());
                        String id = data.get(4);
                        id = id.substring(id.lastIndexOf('=') + 1);
                        String version = data.get(2);
                        version = version.substring(version.lastIndexOf('=') + 1);
                        resultMap.put(id, version);
                    }
                    catch(Exception ignore) {}
                }
                return FileVisitResult.CONTINUE;
            }
        });
    } catch(Exception ignore) {
        return new HashMap<>();
    }
    return resultMap;
}