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