classpath:/

走的是ClassLoader的获取单个URL的方法

  1. URL getResource(String name) {}
  2. 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*

  1. public Enumeration<URL> getResources(String name) throws IOException {}

获取Classpath上所有的满足名称的资源.

  1. Enumeration<URL> resources = ((URLClassLoader) Thread.currentThread().getContextClassLoader())
  2. .findResources("application.properties");
  3. while (resources.hasMoreElements()) {
  4. System.out.println(resources.nextElement());
  5. }

普通目录中的资源与jar文件中的资源的URL的协议是不同的。如果打印出来,可以看到它们开头分别为file:/和jar:file:/

  1. file:/xxxx/target/test-classes/application.properties
  2. jar:file:/xxxx.client.command-sdk-1.0.0.jar!/application.properties

获取所有classpath参数

  1. URLClassLoader cl = (URLClassLoader) Thread.currentThread().getContextClassLoader();
  2. System.out.println(Arrays.toString(cl.getURLs()));


参考

https://blog.csdn.net/hongxingxiaonan/article/details/50486997