如何访问Java中的调用程序的资源目录

Ant*_*ink 1 java jar classloader

我有一个程序使用的库.该库在resources文件夹中加载一个特殊目录.

在图书馆我有方法

public class DataRegistry{

    public static File getSpecialDirectory(){
        String resourceName = Thread.currentThread().getContextClassLoader().getResource("data").getFile().replace("%20", " ");
        File file = new File(resourceName);
        return file;
    }

}
Run Code Online (Sandbox Code Playgroud)

在我的程序中我有主要方法

public static void main(String args[]){
    System.out.println(Data.getSpecialDirectory());
}
Run Code Online (Sandbox Code Playgroud)

当我在数据程序中的junit测试中执行getSpecialDirectory()时,将获取资源并且一切正常.

当我在数据程序(导入的jar)之外的main方法中执行getSpecialDirectory()时,我得到了jar数据目录,而不是执行该程序的程序所期望的目录.

我想让父类加载器能解决这个问题......我相信我的理解可能会有一个根本问题.

为清楚起见:

(图书馆)此文件的第15行:https://gist.github.com/AnthonyClink/11275442

(用法)此文件的第31行:https: //gist.github.com/AnthonyClink/11275661

我的poms可能与它有关,所以分享它们可能很重要:

(图书馆) https://github.com/Clinkworks/Neptical/blob/master/pom.xml

(用法) https://github.com/Clinkworks/Neptical-Maven-Plugin/blob/master/pom.xml

Ste*_*e C 5

  1. Maven使用target/classes和target/test-classes目录来组成用于运行单元测试的类路径.src/main/resources和src/test/resources的内容将与编译的java源(.class文件)一起复制到这些位置.
  2. java.lang.ClassLoader.getResource返回一个java.net.URL.
  3. 在单元测试情况下,ClassLoader.getResource返回一个file:// schemed URL,您的代码按预期工作.
  4. 在打包在jar文件中执行代码时,ClassLoader.getResource不再返回file:// schemed URL.它不能,因为资源不再是文件系统中的单独实体 - 它隐藏在jar文件中.你实际得到的是一个jar:file:// schemed URL.
  5. jar:无法通过[java.io.File]对象访问URL.

如果您只需要阅读资源的内容,则应使用java.lang.ClassLoader.getResourceAsStream(...)并从中读取内容.

请注意,无法更新类装入器资源的内容.