在运行时,应用程序成功在项目的根目录下归档。当在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**

最佳答案

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

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


MonitoringPage.class.getResourceAsStream("/MonitoringPage.htm")将返回一个InputStream


从该InputStream您可以执行类似

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


注意:这全部是假设您在类路径的根目录下有文件(看起来像您的映像中的文件)。路径前面的/会将搜索带到类路径的根。因此,只需使用相对于根目录的文件路径

07-24 09:46
查看更多