Java: Which of multiple resources on classpath JVM takes?

前端 未结 3 2179
伪装坚强ぢ
伪装坚强ぢ 2020-12-02 13:02

If I have multiple files of the same name on classpath (e.g. I have multiple .jar with log4j.properties), what are the rules JVM follows to chose o

3条回答
  •  温柔的废话
    2020-12-02 13:31

    The ClassLoader determines where a resource will be located (taken from ClassLoader JavaDoc):

    The ClassLoader class uses a delegation model to search for classes and resources. Each instance of ClassLoader has an associated parent class loader. When requested to find a class or resource, a ClassLoader instance will delegate the search for the class or resource to its parent class loader before attempting to find the class or resource itself. The virtual machine's built-in class loader, called the "bootstrap class loader", does not itself have a parent but may serve as the parent of a ClassLoader instance.

    So wherever in your code Class#getResource or Class#getResourceAsStream is called, this happens (taken from 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);
    }
    

    ClassLoader.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;
    }
    

    where ClassLoader#findResource is actually to be overwritten by the ClassLoader implementation. This implies that the behavior is different on an application server, a TomCat or if you are running from a jar file, it depends on the ClassLoader implementations of the environment you are currently in.

    Here is an example that you may use to trace what's going under the hood in your particular case.

提交回复
热议问题