无法通过JRXmlLoader加载位于jar文件中的jrxml:获取java.io.FileNotFoundException

时间:2013-12-17 04:49:26

标签: java jasper-reports

我在 Java 应用程序中使用 JasperReports

我有一个名为“reports”的包来存储生成的所有报告。这是我在我的应用程序中调用我的jasper报告的方式。

JasperDesign jd  = JRXmlLoader.load("C:\\Users\\Sandaru Weerathunga\\Desktop\\Dasatha Institute\\src\\reports\\teacherPay.jrxml");

这是有效的。
我没有给出完整的路径,而是尝试了:

JasperDesign jd  = JRXmlLoader.load("/reports/teacherPay.jrxml");

但这在运行程序时显示错误:

net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: 
/reports/teacherPay.jrxml (The system cannot find the path specified)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:176)
at net.sf.jasperreports.engine.xml.JRXmlLoader.load(JRXmlLoader.java:156)

不适合提供 JRXmlLoader 的完整路径,因为如果要在其他计算机上运行此应用程序,则必须根据计算机路径更改所有编码。所以帮助我吧

2 个答案:

答案 0 :(得分:5)

/reports/teacherPay.jrxml是绝对文件路径,这意味着,转到当前驱动器的根目录并在teacherPay.jrxml目录中找到文件reports ...

如果我正确地阅读了你的问题,那就不是你想要的了

相反,请尝试将报告加载为资源(假设您声明它位于package

JasperDesign jd  = JRXmlLoader.load(getClass().getResource("/reports/teacherPay.jrxml"));

如果报告未打包在您的应用程序上下文中,那么您将需要使用相对路径,例如。

JasperDesign jd  = JRXmlLoader.load("reports/teacherPay.jrxml");

现在,说了这么多。除非您在运行时进行动态更改,否则不应加载jrxml文件,而是应该预先编译文件并应加载.jasper文件。这将更快,通常不易出错......

答案 1 :(得分:1)

JasperDesign jd  = JRXmlLoader.load(getClass().getResource("/reports/teacherPay.jrxml"));

这段时间不起作用,因为getResource()会返回URL。如果您的文件路径包含" ",则会返回"%20"这样的

"C:\\Users\\Sandaru Weerathunga\\Desktop\\Dasatha Institute\\src\\reports\\teacherPay.jrxml"

返回

"C:\\Users\\Sandaru%20Weerathunga\\Desktop\\Dasatha%20Institute\\src\\reports\\teacherPay.jrxml"

在这方面,您可以使用getResourceAsStream()方法重新调整InputStream。试试这个,这对我有用。

JasperReport jp = JasperCompileManager.compileReport(getClass().getResourceAsStream("/reports/teacherPay.jrxml"));