类路径中的 Jar

Jar in the classpath

是否有编程方式获取类路径中所有 jar 的完整列表?

我需要它,因为我们在两个平台之间存在行为差异。
一个由我们管理,但另一个不是,我需要知道是否有 或者不是同一个罐子。

取决于你所说的类路径到底是什么意思,实际上有不同种类的类路径:

  1. 引导类路径

    System.getProperty("sun.boot.class.path")
    
  2. 扩展类路径

    System.getProperty("java.ext.dirs")
    
  3. 用户定义的类路径

    System.getProperty("java.class.path")
    

适用于标准 Java SE 应用程序。对于模块化和 Java SE,它更复杂。

Is there a programmatically way to get the complete list of all jar in the classpath ?

这是print out the current project classpath的一种方式:

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

如果需要determine which jar a class is loaded from:

Class klass = ClassInTrouble.class;
CodeSource source = klass.getProtectionDomain().getCodeSource();
System.out.println(source == null ? klass : source.getLocation());

如果有用的话,你也可以get a list of all classes loaded in the JVM