Eclipse 如何使用JasperReports(6.*)解决LinkageError?

Eclipse 如何使用JasperReports(6.*)解决LinkageError?,eclipse,jasper-reports,slf4j,Eclipse,Jasper Reports,Slf4j,e、 g.我们得到: net.sf.jasperreports.engine.JRException: ... Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: $P{REPORT_SCRIPTLET}.setTestRaw_LogOn_TstMsgOn(true, true) Caused by:

e、 g.我们得到:

net.sf.jasperreports.engine.JRException: ...
Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException: 
  Error evaluating expression for source text: 
    $P{REPORT_SCRIPTLET}.setTestRaw_LogOn_TstMsgOn(true, true)
Caused by: java.lang.LinkageError: loader constraint violation: loader 
  (instance of java/net/FactoryURLClassLoader) previously initiated loading 
  for a different type with name "org/slf4j/Logger"
使用JR插件v6.1.0在Eclipse(开普勒)预览版中运行,但在另一个Eclipse使用5.5.1.final运行时不运行

显然,我们使用的是一些构建路径引用的自定义报表scriptlet,它本身使用slf4j api进行日志记录


它似乎与同一类的另一个不同版本相冲突(对于相同的底层类加载隔离)。

对我们来说,最简单的解决方案是使用Jasper插件v5.5.1切换回Eclipse dir备份版本(我们还有一份供所有开发人员使用的)

通过Eclipse安装历史记录“恢复”是不容易的,因为我们的底层更新站点只指向最新的,或者5.5.1.final可能根本没有旧的更新站点。(我们没有进一步调查)

(顺便说一句:在Eclipse中禁用自动更新可能是安全的,以避免此类意外)

环境详情: (…对于那些可能找到其他有效解决方案的人来说,可能的原因。)

对我们来说,这是在构建路径中使用org.slf4j.Logger(拥有slf4j-api-1.7.5.jarslf4j-simple-1.7.5.jar,或者两者都被删除了——没关系……只是在更改后关闭并重新打开所有报告,而不需要重新启动Eclipse)

使用Eclipse.ini jvm选项
-verbose:class
运行Eclipse表明冲突可能与另一个加载的类相关(无论在何处加载(可能由jasper预览编辑器本身使用):
Eclipse/plugins/org.slf4j.api_1.7.2.v201108-1250.jar

假设Jasper从v6开始使用SLF4J,并且没有使用单独的类加载器将其报表特定类/lib的类加载与自己的类版本(或Eclipse安装提供的版本)隔离开来,因此可能会导致此类链接错误(例如…)

6.0.4(我在其中添加了这些信息)中已经有一个已知已解决的bug,但显然没有解决:

我也遇到了同样的问题,我通过在我的项目的构建路径中添加这些JAR解决了这个问题:

  • slf4j-api-1.7.12.jar
  • slf4j-log4j12-1.7.12.jar
  • slf4j-simple-1.7.12.jar

并将
JasperReports库
JasperReports库依赖项
添加到项目中

通过这些步骤

  • 在项目中单击鼠标右键
  • 构建Cath>配置构建路径
  • 转到库并使用
    addexternaljar
  • 使用
    addlibrary
  • 然后转到
    订购并导出
    ,检查新添加的库和jar并单击确定
  • 您将得到如下结果:

    (哇……终于找到了至少一个可接受的解决方法,解决了这个显然groovy类加载问题)

    我们创建了一些非常简单的助手报告
    hlprep.jrxml
    ,它本身

    • 使用前面提到的scriptlet

      • 或者使用/调用任何其他您可能遇到问题的java类
    • 将其设置为
      language=java

      • (其他网站建议从
        language=groovy
        切换到
        java
        ,以消除上述错误,但这通常不是一个选项)
    (现在它应该在
    预览中正常运行了

    每次遇到此错误时(可能是随机的,因为类加载可能是正确的,这取决于您以前在IDE中所做的操作),我们现在可以执行以下操作:

  • 打开
    hlprep.jrxml

    • 最好使用
      打开,使用…JasperReports Preview
      (这样您就不必在后续步骤中明确打开预览)
  • 重新启动您的Eclipse

    • 它应该记住重新启动后打开的文件,否则重新启动后必须首先打开helper报告
  • 选择/预览
    hlprep.jrxml

    • 现在正确的类加载发生了(由“java”上下文触发)
  • 选择/预览失败的(已打开的)其他报告

  • 它现在应该运行良好,即使在更改之后也是如此,但是如果再次打开/关闭新类,它可能会失败(因为类可能会被回收,或者groovy类装入器隔离魔术会以不同的方式装入它)

    我们的环境
    • 日食霓虹灯3
      • 在内部使用Groovy 2.4.5
      • 从JDK1.8.0_121开始
    • Jaspersoft Studio 6.3.2.1决赛
      • 我们有一台6.3.0服务器,但在6.3.1中添加了对Neon的全面支持,因此我们采用了最后一个补丁版本6.3.x
      • 我们以前遇到过一些问题,较新的studio版本无法与较旧的服务器配合使用,因此我们在升级时会更加小心
    • 可能不相关:
      • pom.xml

      • 我们都提供了添加到项目中的jasper库:
        Jaspersoft服务器库
        JasperReports库依赖项
      • 我们还依赖于服务器功能,因此在
        pom.xml
        中也有
        jasperreports-6.3.0.jar
        ,还有一些(不是通过一些公共Maven repo可用的)服务器jar作为
        用户库
        添加到项目中(我们从服务器复制过来)
      • pom.xml

    太棒了。我现在无法重新评估,但我上面的解决方法并不像您的解决方案看起来那么好,因此我将在未验证的情况下接受您的答案。Thx