Java 在运行时使用预编译的jasper文件还是编译jrxml模板更好?

Java 在运行时使用预编译的jasper文件还是编译jrxml模板更好?,java,jasper-reports,Java,Jasper Reports,我有以下两个选项来使用jasper生成PDF 使用预编译的Jrxml(.jasper)文件,如下面的示例代码所示 JRBeanCollectionDataSource beanCollectionDS = new JRBeanCollectionDataSource(List<JavaObject>); File jasperFile = new File("JasperTemplate.jasper"); JasperReport jr = (JasperReport) JRLoa

我有以下两个选项来使用jasper生成PDF

使用预编译的Jrxml(.jasper)文件,如下面的示例代码所示

JRBeanCollectionDataSource beanCollectionDS = new JRBeanCollectionDataSource(List<JavaObject>);
File jasperFile = new File("JasperTemplate.jasper");
JasperReport jr = (JasperReport) JRLoader.loadObject(jasperFile);
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("REPORT_TITLE", "Test Report");
JasperPrint jp = JasperFillManager.fillReport(jr, params, beanCollectionDS);
JRBeanCollectionDataSource beanCollectionDS = new JRBeanCollectionDataSource(List<JavaObject>);
String template = "JasperTemplate.jrxml";
InputStream reportStream = this.getClass().getResourceAsStream(template);
JasperDesign jd = JRXmlLoader.load(reportStream);
JasperReport jr = JasperCompileManager.compileReport(jd);
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("REPORT_TITLE", "Test Report");
JasperPrint jp = JasperFillManager.fillReport(jr, params, beanCollectionDS);
JRBeanCollectionDataSource beanCollectionDS=新的JRBeanCollectionDataSource(列表);
File jasperFile=新文件(“JasperTemplate.jasper”);
JasperReport jr=(JasperReport)JRLoader.loadObject(jasperpile);
HashMap params=新的HashMap();
参数put(“报告标题”、“测试报告”);
JasperPrint jp=JasperFillManager.fillReport(jr、params、beanCollectionDS);
使用Jasper模板(.jrxml)文件,该文件在运行时编译,如下面的示例代码所示

JRBeanCollectionDataSource beanCollectionDS = new JRBeanCollectionDataSource(List<JavaObject>);
File jasperFile = new File("JasperTemplate.jasper");
JasperReport jr = (JasperReport) JRLoader.loadObject(jasperFile);
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("REPORT_TITLE", "Test Report");
JasperPrint jp = JasperFillManager.fillReport(jr, params, beanCollectionDS);
JRBeanCollectionDataSource beanCollectionDS = new JRBeanCollectionDataSource(List<JavaObject>);
String template = "JasperTemplate.jrxml";
InputStream reportStream = this.getClass().getResourceAsStream(template);
JasperDesign jd = JRXmlLoader.load(reportStream);
JasperReport jr = JasperCompileManager.compileReport(jd);
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("REPORT_TITLE", "Test Report");
JasperPrint jp = JasperFillManager.fillReport(jr, params, beanCollectionDS);
JRBeanCollectionDataSource beanCollectionDS=新的JRBeanCollectionDataSource(列表);
String template=“JasperTemplate.jrxml”;
InputStream reportStream=this.getClass().getResourceAsStream(模板);
JasperDesign jd=JRXmlLoader.load(reportStream);
JasperReport jr=jaspecompilemanager.compileReport(jd);
HashMap params=新的HashMap();
参数put(“报告标题”、“测试报告”);
JasperPrint jp=JasperFillManager.fillReport(jr、params、beanCollectionDS);

哪种方法更好,为什么更好。

总结@Andreas提供的答案


需要进行报表编译的确切时间取决于报表设计模板在应用程序执行期间是否发生更改。

如果报表设计(JRXMLs)在运行时没有更改,即应用程序仅向预定义的报表模板提供动态数据和参数值,则可以将报表设计视为应用程序源代码,建议在应用程序构建过程中对其进行编译,并包括编译报表(*.jasper文件)在二进制/部署的应用程序中

在更复杂的场景中,如果需要在运行时生成、更改或部署报表模板,则必须在运行时编译它们。在这种情况下,建议使用基于JDK的报告编译器,因为:

  • 它不需要使用(临时)文件,比如基于JDK的报告 编译器
  • 它使用上下文类加载器来解析类,而基于JDK 报表编译器使用需要设置的文件系统类路径 由用户启动

总结@Andreas提供的答案


需要进行报表编译的确切时间取决于报表设计模板在应用程序执行期间是否发生更改。

如果报表设计(JRXMLs)在运行时没有更改,即应用程序仅向预定义的报表模板提供动态数据和参数值,则可以将报表设计视为应用程序源代码,建议在应用程序构建过程中对其进行编译,并包括编译报表(*.jasper文件)在二进制/部署的应用程序中

在更复杂的场景中,如果需要在运行时生成、更改或部署报表模板,则必须在运行时编译它们。在这种情况下,建议使用基于JDK的报告编译器,因为:

  • 它不需要使用(临时)文件,比如基于JDK的报告 编译器
  • 它使用上下文类加载器来解析类,而基于JDK 报表编译器使用需要设置的文件系统类路径 由用户启动

我对你的建议感到困惑。你说“建议使用JDK编译器…”但你提出了反对意见?我被你的建议弄糊涂了。你说“建议使用JDK编译器…”但你提出了反对意见?