kar*_*oda 4 jasper-reports subreport jasperserver
我搜索了几天来修复这个bug并没有什么新东西.
我有一个报告,其中包括多级子报告,一切正常iReport 3.7.5.我subreport.jasper在第一级使用子报表表达式subreportA.jasper,subreportB.jasper在第二级使用并将所有(主报表和子报表)放在同一路径中.
当我尝试在我的部署上时出现问题JasperServer.当我尝试上传第一个主报表时,iReport向导提示我附加subreport.jrxml资源文件夹中的第一个并使用repo:subreport.jrxml或访问它repo:subreport.jasper.然后我手动上传第二级子报表并执行相同的操作将子报表表达式更改为repo:subreportA.jasper和repo:subreportB.jasper.
我有编译错误: Unable to locate the subreport with expression: ""repo:subreport.jasper"". java.lang.Exception: repo:subreport.jrxml not found.
我尝试打解决方案,没有任何作用.使用:SUBREPORT_DIR @开头,
使用完整路径:repo:/Circuit_Reports/Connectivity/Connectivity_files/,
在.jasper&之间切换.jrxml.
jasperserver_api_engine_impl_0_fix.jar在lib文件夹中使用作为此bug的固定,
我还搜索了数据库记录,以确保它们位于同一个文件夹中并具有相同的父文件夹.
(当然我不想鼓励你阅读这篇长篇详细文章的内容!大胆的标记可能已经足以解决你的问题,但我发现有必要更详细地记录这些棘手的东西!)
由于我在这方面投入了几个小时(在我几周前解决之后,现在进行了更改,但忘记了正确记录,忘记了我是如何做到的,并且在上传和配置时无法以任何形式再次检索此信息)到/在JasperServer中)...这里有一些关于子报告引用的各种网站上提到的聚合功能,它是如何工作的以及可以尝试的...
(如果有希望的话,我会在这里更新我的或其他调查结果)
直到Jasper功能提供类似的"包装"解决方案本身......
要解决与在预览模式下本地运行*.jrxml,*.jasper文件或在JasperServer上远程运行相关的所有问题,我现在使用以下方法,该方法只允许使用单个*.jrxml文件,这将起作用本地和远程无需修改,在多开发人员环境中,支持每个环境独立重构dir结构(路径,名称)(=应该;-)):
Project->Properties->Java Build Path->Libraries->Add)中../jasperserver/WEB-INF/lib/文件夹中jr.utl.EnvScriptlet,它在主报表中执行丑陋的子报表路径/引用魔术
REPORT_SCRIPTLET通过向主报告添加属性来定义:报告属性 - >报告 - >数据集 - > Scriptlet类:jr.utl.EnvScriptlet使用一些自定义属性文件jr.utl.properties或其他提供的系统属性(设置Java系统属性的任何其他方式也可以正常工作 - 已经设置属性的地方将覆盖已加载的文件属性)以配置包括您的不同环境
jr.utl.env属性的当前环境信息(prod,myOsUsrName,test,demo,staging,local,...)
在您的服务器上:../jasperserver/WEB-INF/classes/jr.utl.properties
jr.utl.env=prod
mycompany.local.jr.gui.rep.subrep1.parentdir=repo:/x/y/z/
mycompany.local.jr.gui.rep.subrep2.parentdir=repo:/x/y/z/
mycompany.local.jr.gui.rep.subrep3.parentdir=repo:/x/y/foobar/
Run Code Online (Sandbox Code Playgroud)在您当地的JasperSoft Studio(Eclipse)Java src/build路径中:例如../myrepproject/src/java/jr.utl.properties
jr.utl.env=dietrian
mycompany.local.jr.gui.rep.subrep1.parentdir=D:/reporting/src/reports/
mycompany.local.jr.gui.rep.subrep2.parentdir=D:/reporting/src/reports/
mycompany.local.jr.gui.rep.subrep3.parentdir=D:/reporting/src/reports.otherdir/
Run Code Online (Sandbox Code Playgroud)
为了在我们的环境中实现源修改独立性,我们local.properties根据这个想法对这些值进行参数化并通过一些依赖于工作空间/特定于用户的文件生成它们:
|- build.xml (containing the ANT build magic)
|- build.properties (containing global properties)
|- local.properties (ignored in version control, e.g. .hgignore, user-specific generated from local.template.properties)
|- local.template.properties (source for ANT build task generating the local.properties above)
|- mycomp.local.proj.reporting.dir=D:/reporting
|- src/reports
|- jr.utl.properties (ignored in version control, user-specificly generated based on template below)
|- jr.utl.template.properties (source for ANT build task generating the jr.utl.properties above)
jr.utl.env=${user.name}
mycompany.local.jr.gui.rep.subrep1.parentdir=${mycomp.local.proj.reporting.dir}/src/reports/
mycompany.local.jr.gui.rep.subrep2.parentdir=${mycompany.local.jr.gui.rep.subrep1.parentdir}
mycompany.local.jr.gui.rep.subrep3.parentdir=${mycomp.local.proj.reporting.dir}/src/reports.otherdir/
定义BASE_DIR主报告参数,例如
$P{REPORT_SCRIPTLET}.getProp("mycompany.allsubreports.parentdir")(匹配文件中某些与环境相关的属性jr.utl.properties)
jr.utl.EnvScriptlet.getSubrepPath( $P{BASE_DIR}, "subrep1.jrxml")
jr.utl.EnvScriptlet.getSubrepPathByPropKey( $P{BASE_DIR}, "mycompany.local.jr.gui.rep.subrep1.name")jr.utl.EnvScriptlet.getSubrepPathByPropKeys( "mycompany.local.jr.gui.rep.subrep1.parentdir", "mycompany.local.jr.gui.rep.subrep1.name")$P{REPORT_SCRIPTLET}.getSubrepPath(...) 在这里不起作用:-((我不知道为什么)(4:当然,我仍然看到一些小的改进,但它似乎比我迄今发现的所有丑陋的解决方案要好得多.改进我会看到:
REPORT_SCRIPTLET或脚本功能可能不是最好的方法,但它可能适用于绝大多数用例(5:相关的特殊处理在这里编码:EnvScriptlet.java/getSubrepPath(String,String,boolean,String []))
首先要知道的是,JasperStudio中的处理/设置与Jasper Server(Repository)5上的处理完全不同 ......
假设我们有以下环境:
C:\eclipse\C:\workspace\C:\workspace\report-project\C:\workspace\report-project\src/reportsC:\workspace\report-project\src/reports/masterrep.jrxmlC:\workspace\report-project\src/reports/subrep1.jrxmlC:\workspace\report-project\src/reports/somesubdir/subrep2.jrxmlBASE_DIR我们的工作区主报告中的(在下一节中解释)设置为C:\workspace\report-project\src/reports//x/y/z/
不要与可视命名路径混淆,例如可能是这样Financial Reports/Expenses/Current Year)(以及其他"Jasper运行时环境",如自定义Java Jasper包用法):
BASE_DIR
/可能包括1, 因为有些情况下你可能/想要以一种空的或"未删除"的路径表达式的方式使用它
$P{BASE_DIR} + "subrep1.jrxml"哪个应该解决
repo:subrep1.jrxmlSUBREPORT_DIR)(1:在处理类似目录的结构时,我个人总体上发现了一个不好的做法(在这方面没有看Jasper Reports))
(负责更多功能的IReport官方继任者)
(如果您不使用预览功能,这可能对您无趣)
BASE_DIR因为工作目录是eclipse目录,所以相对路径表达式不起作用,例如C:\eclipseEclipse->Window->Preferences->JasperStudio->Properties->Add例如my.base.dir
new java.io.File(System.getProperty("my.base.dir")).getCanonicalPath() + "/"我们的BASE_DIR表达式(这些道具可能仅由设计者自己使用,但未在预览运行中设置)Eclipse->Window->Preferences->JasperStudio->Report Execution->Virtualizer Temporary Path处理存储报告结果"缓存"的东西是无关的(在这里没用)*.jrxml文件(如我做3)你要引用一些subrep1.jrxml这样的:net.sf.jasperreports.engine.JasperCompileManager.compileReport($P{BASE_DIR} + "subrep1.jrxml")(3:我不需要*.jasper明确的文件,也不明白为什么我要处理它们.BTW JasperServer WebGUI似乎只支持上传*.jrxml文件)
(例如,由某些Tomcat应用程序服务器提供并将其数据存储在某些postgres数据库中)
subrep1.jrxml从上面上传的资源ID为subrep1.jrxml(因此使本地设计引用和服务器引用的处理不那么复杂)BASE_DIR以repo:在待上传的主报告
$P{BASE_DIR} + "subrep1.jrxml"也$P{BASE_DIR} + "somesubdir/subrep2.jrxml"应该在服务器上工作repo:/x/y/z/masterrep.jrxml_files/masterrep.jrxml_(2:在这种情况下我不推荐;它没有文档记录,可能会更改;最好将子报表放入"GUI repo路径",如下所述)
假设我们将子报告上传到主repo id-path /x/y/z/(如上图所示)
我们必须区分两种不同的用例
我们不希望将子报表用作独立报表(它始终只包含在其他主报表中)
在这种情况下,我们应该使用Add Resource->File->JRXML并上传它
../subrep1.jrxml或者./subrep1.jrxml不工作,因为似乎底层逻辑无法处理相对路径表达式..(并且可能.不那么好)(这实际上很好:-()
所以我们要做的就是在masterrep.jrxml中提供一个绝对的规范路径BASE_DIR,例如repo:/x/y/z/
我们要使用的报表作为一个独立的报告,以及
在这种情况下,我们应该使用上传它 Add Resource->JasperReport
这显然会创建一个repo:/x/y/z/subrep1.jrxml_files包含报告本身和其他资源的隐藏文件夹
这就是为什么我们不仅需要调整BASE_DIR(如上所述),还要调整子报表的表达式,例如$P{BASE_DIR} + "subrep1.jrxml_files/subrep1.jrxml_"(指向子报表本身)
并且可能会删除net.sf.jasperreports.engine.JasperCompileManager.compileReport(...)包装函数,因为服务器会自动为文件执行此操作*.jrxml
我没有完全调查一些其他可能错误使用的方法,这些方法对我来说无法解决上述问题(也许其他人在这里有一些结果/更正):
$P{REPORT_FILE_RESOLVER}.resolveFile("subrep1.jrxml") (空指针异常)$P{REPORT_CONTEXT}.getRealPath("subrep1.jrxml") $P{REPORT_CONTEXT}.getProperty("REPORT_FILE_RESOLVER").resolveFile("subrep1.jrxml")因为我喜欢自动化报表设计和部署过程,所以我写了一些ANT任务来处理本地*.jrxml文件,以便部署有关BASE_DIR其他转换的*.jrxml文件转换.
SQL有助于轻松调查jasper服务器postgres元数据库中的资源id路径结构(例如jdbc:postgresql://myjasperhost/jasperserver连接例如postgres用户):
select
f.id as folder_id,
r.id as res_id,
case when f.hidden = true then 1 else 0 end as hidden,
f.uri||case when f.uri = '/' then '' else '/' end||coalesce(r.name,'') as res_uri,
r.resourcetype,
r.creation_date,
r.update_date,
f.uri,
r.name,
-- less important
r.version,
r.parent_folder,
r.childrenfolder,
f.parent_folder,
f.version,
f.name
-- select *
from jiresourcefolder f
left outer join jiresource r on (r.parent_folder = f.id)
where not f.uri like '/themes%'
order by f.uri||coalesce(r.name,'')
Run Code Online (Sandbox Code Playgroud)
有关此问题的Jaspersoft论坛的问题包括: