Java:类路径 JVM 上的多个资源中有哪些是需要的?
如果我在类路径上有多个同名的文件(例如,我有多个 ),JVM选择一个时遵循什么规则?.jar
log4j.properties
如果我在类路径上有多个同名的文件(例如,我有多个 ),JVM选择一个时遵循什么规则?.jar
log4j.properties
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 实现。
下面是一个示例,您可以使用该示例来跟踪特定情况下的后台情况。