Java:类路径 JVM 上的多个资源中有哪些是需要的?

2022-08-31 16:43:13

如果我在类路径上有多个同名的文件(例如,我有多个 ),JVM选择一个时遵循什么规则?.jarlog4j.properties


答案 1

它由使用 option 指定资源(即通常为 jar 文件)的顺序指定。类路径上的“较早”资源优先于在其后指定的资源。这也可以在应用程序的清单文件中设置,然后您无需提供选项。您可能需要查看这些文章,了解如何使用清单文件。-classpath-classpath

“如何找到类”的详尽描述可以在这里找到,其中关于JAR类路径类的部分描述了JAR文件搜索的逻辑。


答案 2

ClassLoader 确定资源的位置(取自 ClassLoader JavaDoc):

类使用委派模型来搜索类和资源。类装入器的每个实例都有一个关联的父类装入器。当请求查找类或资源时,ClassLoader 实例会先将类或资源的搜索委托给其父类装入器,然后再尝试查找类或资源本身。虚拟机的内置类装入器(称为“引导类装入器”)本身没有父级,但可以用作类装入器实例的父级。

因此,在你的代码中,无论在什么地方调用 Class#getResource 或 Class#getResourceAsStream,都会发生这种情况(取自 Class.java)

public java.net.URL getResource(String name) {
    name = resolveName(name);
    ClassLoader cl = getClassLoader0();
    if (cl==null) {
        // A system class.
        return ClassLoader.getSystemResource(name);
    }
    return cl.getResource(name);
}

类加载器.java:

public URL getResource(String name) {
    URL url;
    if (parent != null) {
        url = parent.getResource(name);
    } else {
        url = getBootstrapResource(name);
    }
    if (url == null) {
        url = findResource(name);
    }
    return url;
}

其中 ClassLoader#findResource 实际上是要被 ClassLoader 实现覆盖的。这意味着在应用程序服务器、TomCat 上的行为是不同的,或者如果您从 jar 文件运行,则取决于您当前所处的环境的 ClassLoader 实现。

下面是一个示例,您可以使用该示例来跟踪特定情况下的后台情况。


推荐