【问题标题】:Can't load jrxml located in jar file via JRXmlLoader: getting java.io.FileNotFoundException [duplicate]无法通过 JRXmlLoader 加载位于 jar 文件中的 jrxml:获取 java.io.FileNotFoundException [重复]
【发布时间】:2023-04-02 13:20:02
【问题描述】:

我在我的 Java 应用程序中使用 JasperReports

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

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

【问题讨论】:

    标签: java jasper-reports


    【解决方案1】:

    /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 文件。这会更快,通常更不容易出错...

    【讨论】:

    • 非常感谢您的帮助... JRXmlLoader.load(getClass().getResource("/reports/teacherPay.jrxml")) 不起作用,但 JRXmlLoader.load(getClass().getResourceAsStream ("/reports/teacherPay.jrxml")) 运行良好.. 无论如何再次感谢你.. :)
    • 不记得是 URL 还是 InputStream - 很高兴你让它工作了
    【解决方案2】:
    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"
    

    就此而言,您可以使用返回InputStreamgetResourceAsStream() 方法。试试这个,这对我有用。

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

    【讨论】:

      猜你喜欢
      • 2012-05-03
      • 2023-04-02
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      相关资源
      最近更新 更多