在运行时,应用程序成功在项目的根目录下归档。当在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"
。
JAVA_HOME=C:\Program Files\Java\jdk1.7.0_51
Path=.......**C:\Program Files\Java\jdk1.7.0_51\bin**
最佳答案
不要将其作为文件从文件系统中读取(使用File
,FileReader
或其许多FileXxx
变体时会发生这种情况)。打包jar后,文件将不再位于您期望的系统文件位置
而是通过URL
将其作为资源读取。您可以使用:MonitoringPage.class.getResourceAsStream("/MonitoringPage.htm")
将返回一个InputStream
。
从该InputStream
您可以执行类似
InputStream is = MonitoringPage.class.getResourceAsStream("/MonitoringPage.htm");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
注意:这全部是假设您在类路径的根目录下有文件(看起来像您的映像中的文件)。路径前面的
/
会将搜索带到类路径的根。因此,只需使用相对于根目录的文件路径