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

我在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的完整路径是不合适的,因为如果要在其他计算机上运行此应用程序,则必须根据计算机路径更改所有编码。 所以帮助我

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

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

相反,尝试将报告作为资源加载(假设您声明它在一个package

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

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

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

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

 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" 

在这种情况下,您可以使用返回InputStream getResourceAsStream()方法。 试试这个,这对我有用。

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