当前位置: 首页 > 知识库问答 >
问题:

如何从jar文件加载碧玉报告?

郏志学
2023-03-14

如何从jar文件中加载已编译的jasper报告,而不是通过硬盘驱动器上的特定路径?

我的报告在我的机器上运行良好,因为我已经设置了报告的路径:

jasperReport1 = (JasperReport) JRLoader.loadObjectFromFile("/Users/admin/Documents/HCCE/Semester 2/OOP/Projects2/TestApp/src/ie/test/OMACYTDReportFinalpg1.jasper");
jasperReport2 =(JasperReport) JRLoader.loadObjectFromFile("/Users/admin/Documents/HCCE/Semester 2/OOP/Projects2/TestApp/src/ie/test/OMACYTDReportFinalpg2.jasper");

但是当在另一台计算机上从完成的jar中工作时,报告没有被加载。所以我尝试使用输入流并将其传递给JasperFillManager,但是没有任何效果——输入流没有找到文件。我走错路了吗?

InputStream jasper1 = getClass().getResourceAsStream("src/ie/test/OMACYTDReportFinalpg1.jasper");
InputStream jasper2 = getClass().getResourceAsStream("src/ie/test/OMACYTDReportFinalpg2.jasper");

我最初的工作代码:

private void yTDReportBtnActionPerformed(java.awt.event.ActionEvent evt) {                                             
    try
    {
        JasperReport jasperReport1 = null;
        JasperReport jasperReport2 = null;
        JasperPrint jasperPrint = null;
        JasperDesign jasperDesign = null;
        Map parameters = new HashMap();
        SimpleDateFormat formatter = new SimpleDateFormat("dd-mmm-yyyy");  
        String today = formatter.format(new java.util.Date());

        //load just the compiled jasper files, to save time
        //First merge the two jasper reports into one to get page1 and page 2 in same document

        jasperReport1 = (JasperReport) JRLoader.loadObjectFromFile("/Users/admin/Documents/HCCE/Semester 2/OOP/Projects2/TestApp/src/ie/test/OMACYTDReportFinalpg1.jasper");
        jasperReport2 =(JasperReport) JRLoader.loadObjectFromFile("/Users/admin/Documents/HCCE/Semester 2/OOP/Projects2/TestApp/src/ie/test/OMACYTDReportFinalpg2.jasper");

        JasperPrint jp1 = JasperFillManager.fillReport(jasperReport1, parameters,new JRBeanCollectionDataSource(ie.test.BeanFactory.getCalcs()));
        JasperPrint jp2 = JasperFillManager.fillReport(jasperReport2, parameters, new JRBeanCollectionDataSource(ie.test.BeanFactory.getCalcs()));

        List pages = jp2 .getPages();
        for (int j = 0; j < pages.size(); j++) {
        JRPrintPage object = (JRPrintPage)pages.get(j);
        jp1.addPage(object);
        jp1.setName(unitNameLbl.getText() + " - Financial Year To Date - " + today );

}
        JasperViewer.viewReport(jp1, false);

    }
    catch(Exception ex)
    {
        System.out.println("EXCEPTION: "+ex.getMessage() + ex);
    }
}                        

现在,更改后的代码不起作用:

private void yTDReportBtnActionPerformed(java.awt.event.ActionEvent evt) {                                             
    try
    {
        JasperReport jasperReport1 = null;
        JasperReport jasperReport2 = null;
        JasperPrint jasperPrint = null;
        JasperDesign jasperDesign = null;
        Map parameters = new HashMap();
        SimpleDateFormat formatter = new SimpleDateFormat("dd-mmm-yyyy");  
        String today = formatter.format(new java.util.Date()); 

        //load just the compiled jasper files, to save time
        //First merge the two jasper reports into one to get page1 and page 2 in same document
        InputStream jasper1 = getClass().getResourceAsStream("src/ie/test/OMACYTDReportFinalpg1.jasper");
        InputStream jasper2 = getClass().getResourceAsStream("src/ie/test/OMACYTDReportFinalpg2.jasper");


        JasperPrint jp1 = JasperFillManager.fillReport(jasper1, parameters,new JRBeanCollectionDataSource(ie.test.BeanFactory.getCalcs()));
        JasperPrint jp2 = JasperFillManager.fillReport(jasper2, parameters, new JRBeanCollectionDataSource(ie.test.BeanFactory.getCalcs()));

        List pages = jp2 .getPages();
        for (int j = 0; j < pages.size(); j++) {
        JRPrintPage object = (JRPrintPage)pages.get(j);
        jp1.addPage(object);
        jp1.setName(unitNameLbl.getText() + " - Financial Year To Date - " + today );

}
        JasperViewer.viewReport(jp1, false);


    }
    catch(Exception ex)
    {
        System.out.println("EXCEPTION: "+ex.getMessage() + ex);
    }
}

任何帮助非常感谢!

好的更新:我通过创建一个名为“reports”的新包并使用

InputStream jasper1 = getClass().getResourceAsStream("/reports/OMACYTDReportFinalpg1.jasper");
InputStream jasper2 = getClass().getResourceAsStream("/reports/OMACYTDReportFinalpg2.jasper");     

这在Netbean中运行良好,但当我编译为jar时,它仍然无法加载文件!!?

你知道我做错了什么吗?

共有3个答案

齐晟
2023-03-14
InputStream jasper1 = getClass().getResourceAsStream("src/ie/test/OMACYTDReportFinalpg1.jasper");
InputStream jasper2 = getClass().getResourceAsStream("src/ie/test/OMACYTDReportFinalpg2.jasper");
华章横
2023-03-14

老话题,但可能有用。我觉得你的jar里面没有src文件夹。

InputStream jasper2 = getClass().getResourceAsStream("/ie/test/OMACYTDReportFinalpg2.jasper");

更高级的方法是:把你的jasper报告、图片和其他资源放入jar。

将YourClass放在jar文件中,并使用类加载资源。getResourceAsStream(),您需要在加载资源之前添加加载程序扩展

  (JasperReport) JRLoader.loadObject("stream or path");

  // DefaultJasperReportsContext user ExtensionsEnvironment
  ExtensionsEnvironment.setThreadExtensionsRegistry(LoaderExtention.INSTANCE);

以下加载资源的示例

  public class LoaderService
    implements RepositoryService
  {
    public static final RepositoryService INSTANCE = new LoaderService();

    @Override
    public void setContext(RepositoryContext repositoryContext)
    {
    }

    @Override
    public void revertContext()
    {
    }

    @Override
    public InputStream getInputStream(String file)
    {
      LOGGER.fine(String.format("getInputStream('%s')", file));
      return <YourClass>.class.getResourceAsStream(file);
    }

    @Override
    public Resource getResource(String file)
    {
      LOGGER.fine(String.format("getResource('%s') not implemented", file));
      return null;
    }

    @Override
    public <K extends Resource> K getResource(String file, Class<K> cls)
    {
      LOGGER.fine(String.format("getResource('%s', %s)", file, cls != null? cls.getName(): null));

      try
      {
        if (cls == ReportResource.class)
        {
          InputStream resource = getInputStream(file);

          if (resource != null)
          {
            JasperReport report = (JasperReport) JRLoader.loadObject(resource);

            if (report != null)
            {
              ReportResource res = new ReportResource();
              res.setName(file);
              res.setReport(report);
              return (K) res;
            }
          }
        }
        else if (cls == InputStreamResource.class)
        {
          InputStream resource = getInputStream(file);

          if (resource != null)
          {
            InputStreamResource res = new InputStreamResource();
            res.setInputStream(resource);
            return (K) res;
          }
        }
      }
      catch (JRException e)
      {
      }

      return null;
    }

    @Override
    public void saveResource(String string, Resource resource)
    {
      // TODO Implement this method
    }
  }

  public class LoaderExtention
    implements ExtensionsRegistry
  {
    public static final LoaderExtention INSTANCE = new LoaderExtention();

    @Override
    public <T extends Object> List<T> getExtensions(Class<T> cls)
    {
      ExtensionsRegistry system = ExtensionsEnvironment.getSystemExtensionsRegistry();
      List<T> services = null;

      if (system != null)
        services = system.getExtensions(cls);

      if (cls == RepositoryService.class)
      {
        List<T> servicesAll = new ArrayList<T>();

        if (services != null)
          servicesAll.addAll(services);

        servicesAll.add((T) LoaderService.INSTANCE); // Try to use system resource loaders then my
        services = servicesAll;
      }

      LOGGER.fine(String.format("getExtensions(%s) = %s", cls.getName(), services));
      return services;
    }
  }

我使用JasperReport 5.5玩得开心。

易宣
2023-03-14

你应该把贾斯珀的报告放进去

your app/src/main/resources/报表

然后从java类调用报告

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

再见!

 类似资料:
  • 问题内容: 我在寻找解决此问题的方法时遇到问题。运行它后,我的代码可以正常工作。它假定将我的sql数据库中的数据显示到jtable上,并且有一个按钮将触发显示jasper报告,但存在一点问题,它始终向我显示消息“文档无页面”。这是为什么?有人可以帮我解决我的问题吗?我做错什么了? 这是我的代码: 这是XML报告: 问题答案: 首先,资源管理… 如果可以,您应该只打开与数据库的单个连接。确保在关闭应

  • 使用 iReport 3.7.5,我预览了 Jasper Report,我想将其另存为 PDF 文件。PDF 文件已创建,但 PDF 文件上缺少粗体和斜体格式。 请告诉我如何保存正确的PDF文件。

  • 问题内容: 我想在碧玉报告中显示图像。我在.jrxml上具有以下内容: 图像logo.jpg与.jrxml位于同一目录中。只是说这对我不起作用。我在Google上搜索了一下,发现jasper报告将我放在.jrxml中的内容视为到JVM目录的相对路径,并且要更改此设置,我需要将返回文件的FileResolver作为“ REPORT_FILE_RESOLVER”参数传递。因此,我在.java中进行了以

  • 我需要添加共享资源-lang3 和共享资源-math3,以便我可以在我的报告中生成中位数。我已经下载了这些文件,但是如何将它们添加到类路径中,以便jaspersoft工作室可以引用它? 我使用的是贾斯珀软件专业工作室 5.6.1 我尝试进入项目浏览器并右键单击项目,但是没有类路径选项。 这不是jaspersoft studio中use外部JAR文件的副本,因为建议的解决方案是:右键单击项目文件夹

  • 我的数据库中有1000000.00,但由于逗号的缘故,我不知道如何合计这些数字。。有人能帮我吗?im使用jasper reports和netbeans

  • 我有一颗春豆: 在jrxml中: 但这抛出了一个 NullPointerException,因为 customerWrapperCache 是空的。 正确的做法是什么?