classpath:/
走的是ClassLoader的获取单个URL的方法
URL getResource(String name) {}
protected URL findResource(String name){}
如果classpath上有多个路径里有相同的资源,那么按照classpath参数中指定的 路径或jar顺序来加载,查找到则直接返回。
URLClasspath中的URL来自于classpath参数,通过改变classpath参数中文件的顺序,如分别执行java -cp target/test-classes:target/classes com.demo.MainClass与 java -cp target/classes:target/test-classes: com.demo.MainClass 。可以得出如下结论,Classloader在加载资源时,查找资源的位置顺序与-classpath中指定的顺序一致。如果资源在classes目录和和test-classes包中同时存在,参数为 target/test-classes:target/classes 则首先找到的是test-classes包中的资源,参数为target/classes:target/test-classes 则首先找到的是classes目录中的资源。
classpath*
public Enumeration<URL> getResources(String name) throws IOException {}
获取Classpath上所有的满足名称的资源.
Enumeration<URL> resources = ((URLClassLoader) Thread.currentThread().getContextClassLoader())
.findResources("application.properties");
while (resources.hasMoreElements()) {
System.out.println(resources.nextElement());
}
普通目录中的资源与jar文件中的资源的URL的协议是不同的。如果打印出来,可以看到它们开头分别为file:/和jar:file:/
file:/xxxx/target/test-classes/application.properties
jar:file:/xxxx.client.command-sdk-1.0.0.jar!/application.properties
获取所有classpath参数
URLClassLoader cl = (URLClassLoader) Thread.currentThread().getContextClassLoader();
System.out.println(Arrays.toString(cl.getURLs()));
参考
https://blog.csdn.net/hongxingxiaonan/article/details/50486997