【问题标题】:Why can my library not access its resources?为什么我的图书馆无法访问其资源?
【发布时间】:2016-03-16 03:56:35
【问题描述】:

我有一个读取文件的类:

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,说类 @ 987654324@找不到指定的文件。这很有趣,因为异常消息中指定的路径实际上是文件的正确路径。

您可以找到文件here

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

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

【问题讨论】:

  • URITesting.jar 中没有 test_file.txt。你是说 ClassLibraryTest.jar 吗?
  • 是的,我的意思是 ClassLibraryTest.jar。 ReadingResource.readResource() 方法应该在它自己的资源中查找test_file.txt 文件,即在 ClassLibraryTest.jar 中。

标签: java jar classpath classloader packaging


【解决方案1】:

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

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

附带说明:使用阅读器阅读时,最好指定编码:

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 2014-05-16
    • 2018-06-18
    • 2020-12-16
    • 1970-01-01
    • 2021-11-23
    • 2015-09-04
    • 1970-01-01
    • 2022-11-08
    相关资源
    最近更新 更多