传递到SUBREPORT_DIR当子报表JAR文件内的路径点[Jasper报表4.5](Passin

2019-07-29 13:01发布

我有路过的问题SUBREPORT_DIR路径我子报表。 报告实际上是在同一个文件夹中,但在JAR文件中。 我已经试过这样的事情(可能不准确):

parameterList = new HashMap<String, Object>();

URL mainReport = this.getClass().getResource("mainReport.jasper");
String mainReportPath = mainReport.getPath();
String subreportDir = mainReportPath.substring(0, mainReportPath.lastIndexOf("/")+1);

parameterList.put("SUBREPORT_DIR", subreportDir);

该JAR文件中这一路径点,但我得到net.sf.jasperreports.engine.JRException: Resource not found at : ...在报告生成。 我怎样才能使这项工作?

编辑

我试图定义我没有报表的SUBREPORT_DIR ,但没有运气:

<subreport>
      <reportElement x="0" y="32" width="475" height="17"/>
      <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{current})]]></dataSourceExpression>
      <subreportExpression><![CDATA["mysubreport.jrxml"]]></subreportExpression>
</subreport>

Answer 1:

这可能比较容易去除SUBREPORT_DIR完全。 iReport的默认是为了方便将其添加到跟踪你的子报表。 但你并不需要保留它。

你的情况的报告是在同一个目录,并在该.jar,因此他们将在classpath。 从.jrxml为参考更改$P{SUBREPORT_DIR} + "mysubreport.jasper"简单"mysubreport.jasper" 然后删除报告中的参数,并摆脱你的代码,试图找出目录来使用的。



Answer 2:

我的主要问题是,我正在使用自定义JAR装载机,这碧玉不知道的。 好消息是,还可以通过子报表作为java.net.URLjava.io.InputStream

Java代码:

InputStream subInputStream = this.getClass().getResourceAsStream("sub.jasper");
parameterList.put("SUBREPORT_INPUT_STREAM", subInputStream);

JRXML:

<subreportExpression class="java.io.InputStream"><![CDATA[$P{SUBREPORT_INPUT_STREAM}]]></subreportExpression>


Answer 3:

如果我没有记错,你应该能够引用只是基于罐子里面编译碧玉文件的位置的报表。 例如,如果报表是在一个名为包test.reportsSUBREPORT_DIR值,你应该能够通过在/test/reports/

如果还是不行,请尝试编译报道移动到默认包和刚刚成立SUBREPORT_DIR/代替。



文章来源: Passing SUBREPORT_DIR to subreport when the path points inside a JAR file [Jasper Reports 4.5]