为什么我的图书馆无法访问其资源?

时间:2015-12-10 13:28:27

标签: java jar classpath classloader packaging

我有一个读取文件的类:

package classlibrary;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;

public class ReadingResource {
    public static String readResource() throws IOException {
        URL resource = ClassLoader.getSystemClassLoader().getResource("classlibrary/test_file.txt");
        BufferedReader br = new BufferedReader(new FileReader(resource.getPath()));
        return br.readLine();
    }
}

资源文件与此类位于同一目录中。 我从这个类和文件中创建了一个库。

现在我想在其他课程中使用它:

package uritesting;

import classlibrary.ReadingResource;
import java.io.IOException;

public class URITesting {
    public static void main(String[] args) throws IOException {
        System.out.println(ReadingResource.readResource());
    }
}

当我从这个类中创建.jar文件时,将类设置为主类,从上面添加.jar并将其作为“java -jar URITesting.jar”执行。我得到一个FileNotFoundException,说类{ {1}}找不到指定的文件。这很有趣,因为异常消息中指定的路径实际上是文件的正确路径。

您可以找到文件here

修改 我在NetBeans中开发了这个项目。当我在那里运行它,它工作正常。在这种情况下,类路径是不同的。它包含ReadingResourceURITestingProject的资源。

但是,当我将其作为独立的JAR运行时,类路径仅包含ReadingResource。对我来说奇怪的是,它没有抱怨找不到课程URITestingProject。这意味着它已加载,但它不在类路径中:/

1 个答案:

答案 0 :(得分:1)

问题是resource.getPath()。无法计算路径,对文件读取器有效,在jar文件内,在另一台服务器上有效等等。但是,您可以通过流来获取数据:

    InputStream data = ClassLoader.getSystemClassLoader().getResourceAsStream("classlibrary/test_file.txt");
    BufferedReader br = new BufferedReader(new InputStreamReader(data, "utf-8"));

作为旁注:在阅读读者时,最好指定编码: