Java 如何构建jar工件以便在运行时能够读取打包的文件?

Java 如何构建jar工件以便在运行时能够读取打包的文件?,java,jar,Java,Jar,在运行时,应用程序成功地在项目的根目录下创建文件。在IntelliJ中执行项目时,所有这些都可以正常工作,但当IntelliJ在Windows环境中执行构建jar工件时,它在查找/读取文件时遇到问题,尽管这些文件位于jar文件的根目录中。如何修复它 更新 我使用的是Jersey框架。我从根路径读取文件,如下所示: package example; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produc

在运行时,应用程序成功地在项目的根目录下创建文件。在IntelliJ中执行项目时,所有这些都可以正常工作,但当IntelliJ在Windows环境中执行构建jar工件时,它在查找/读取文件时遇到问题,尽管这些文件位于jar文件的根目录中。如何修复它

更新 我使用的是Jersey框架。我从根路径读取文件,如下所示:

package example;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

@Path("/monitor")
public class MonitoringPage {

    @GET
    @Produces("text/html")
    public String getMonitoringPage() throws IOException {

        String page, line;
        page = "";
        BufferedReader br = new BufferedReader(new FileReader("MonitoringPage.htm"));
        while((line = br.readLine()) != null){
            page += line + "\r\n";
        }
        br.close();
        return page;
    }
}
我的jar的根目录中有MonitoringPage.htm,但由于某些奇怪的原因,它找不到它

我正在用bat脚本运行jar:

java -jar "Rs.jar"


不要将其作为文件系统中的文件读取(当您使用
文件
文件阅读器
或其许多
文件xxx
变体时会发生这种情况)。打包jar后,该文件将不再位于预期的系统文件位置

而是通过
URL
将其作为资源读取。您可以使用:

  • MonitoringPage.class.getResourceAsStream(“/MonitoringPage.htm”)
    将返回一个
    InputStream
从该
InputStream
中,您可以执行以下操作

InputStream is = MonitoringPage.class.getResourceAsStream("/MonitoringPage.htm");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

注意:这都是假设文件位于类路径的根目录下(从图像上看是这样的)。路径前面的
/
将把搜索带到类路径的根。因此,只需使用相对于根目录的文件路径

是否愿意以正常的stackoverflow方式共享一些代码?我相信你嵌入的任何图像都非常好,但我们中的许多人都支持阻止图像共享站点的代理,并且看不到它。你正在加载哪些文件,你是如何从代码中加载它们的,以及你的类路径是什么样的?谢谢,它从jar中打开的很好,但是在java.io.Reader中出现了新问题
java.lang.NullPointerException.
at
BufferedReader br=new BufferedReader(new InputStreamReader(is))。为什么在IntelliJ中运行时无法读取文件?我不使用IntelliJ,所以我不确定如何将资源构建到IDE运行时。例如,在Eclipse中,
src
中的所有文件都被复制到
bin
目录中(当您尝试运行时),该目录是pat类的根目录,所有
.class
文件都被编译到该目录中。因此,当您的类文件从IDE编译时,您需要检查它们的位置。看看文件是否被复制到那里
InputStream is = MonitoringPage.class.getResourceAsStream("/MonitoringPage.htm");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));