Java 当路径指向JAR文件内部时,将SUBREPORT_DIR传递给SUBREPORT[Jasper Reports 4.5]

Java 当路径指向JAR文件内部时,将SUBREPORT_DIR传递给SUBREPORT[Jasper Reports 4.5],java,jasper-reports,ireport,Java,Jasper Reports,Ireport,我在将子报表\u DIR路径传递到我的子报表时遇到问题。这些报告实际上在同一个文件夹中,但在一个JAR文件中。我尝试过类似的方法(可能不准确): 如果我没有弄错的话,您应该能够根据jar中编译的jasper文件的位置来引用子报告。例如,如果子报表位于名为test.reports的包中,则对于subreport\u DIR值,您应该能够传入/test/reports/ 如果不起作用,请尝试将编译后的报告移动到默认包中,只需将子报告_DIR设置为/ 可能最容易完全删除子报表\u DIR。iRepor

我在将
子报表\u DIR
路径传递到我的子报表时遇到问题。这些报告实际上在同一个文件夹中,但在一个JAR文件中。我尝试过类似的方法(可能不准确):


如果我没有弄错的话,您应该能够根据jar中编译的jasper文件的位置来引用子报告。例如,如果子报表位于名为
test.reports
的包中,则对于
subreport\u DIR
值,您应该能够传入
/test/reports/


如果不起作用,请尝试将编译后的报告移动到默认包中,只需将
子报告_DIR
设置为
/

可能最容易完全删除
子报表\u DIR
。iReport默认情况下会添加它,以便跟踪子报表。但是你不需要保留它


在您的例子中,报告位于同一目录和.jar中,因此它们将位于类路径上。将.jrxml中的引用从
$P{SUBREPORT\u DIR}+“mysubreport.jasper”
更改为简单的
“mysubreport.jasper”
。然后从报告中删除参数,并删除试图确定要使用哪个目录的代码。

我的主要问题是,我使用的是一个自定义JAR加载程序,Jasper不知道。好消息是,还可以将子报表作为
java.net.URL
java.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>


在主文件中的子报表对象的“KEY”属性中,尝试分配子报表文件中定义的子报表名称,这样子报表值将返回到主报表。

只有在jar中的默认包中,子报表值才有效吗?这意味着,如果在他的项目中,他在test.reports中有它们,这将不起作用。或者它只知道主报告的位置吗?我会尝试一下,但是我是否必须严格地引用
.jrxml
?我总是用
.jasper
的方式来做。在生成报告时调用.jasper,即使引用的是.jrxml。!是的,我对.jrxml的引用不太正确。我会更新帖子。@jschoen,我想它会根据.jasper的位置而不是它的包来找到它。但我没有测试过,而且我还不足以成为一个懂Java的人。我想Daniel会确认什么对他有效。我能实现我想要的唯一方法是将.jasper文件放入默认包中。一旦我这样做并尝试编译主报告,它就无法编译主报告,说明它找不到子报告。我正在使用ireport编译主报告。如何在使用inpustream时解决此编译错误\
InputStream subInputStream = this.getClass().getResourceAsStream("sub.jasper");
parameterList.put("SUBREPORT_INPUT_STREAM", subInputStream);
<subreportExpression class="java.io.InputStream"><![CDATA[$P{SUBREPORT_INPUT_STREAM}]]></subreportExpression>