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

时间:2015-07-30 09:16:08

标签: 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: java.lang.LinkageError: loader constraint violation: loader 
  (instance of java/net/FactoryURLClassLoader) previously initiated loading 
  for a different type with name "org/slf4j/Logger"

Eclipse(Kepler)预览版中使用JR插件v6.1.0 运行,但不在运行5.5.1.final的其他Eclipse

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

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

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,我通过在项目中的Build路径中添加这些Jars来解决它:

  • slf4j-api-1.7.12.jar
  • slf4j-log4j12-1.7.12.jar
  • SLF4J-简单1.7.12.jar

并将JasperReports LibraryJasperReports Library Dependencies添加到项目

使用这些步骤

  1. 右键单击项目
  2. Build Cath>配置构建路径
  3. 转到图书馆并使用Add External JARs
  4. 添加广告
  5. 使用Add Library
  6. 添加JasperReport库和JasperReport库依赖项
  7. 然后转到Order and Export并检查新添加的库和Jars,然后单击“确定”
  8. 你会得到这样的结果:

    enter image description here

答案 1 :(得分:1)

对我们来说最简单的解决方案(在摆弄库和设置之后)是使用Jasper插件v5.5.1.final切换回Eclipse dir备份版本(我们仍然拥有所有开发人员的副本)。

"还原"并不容易。通过Eclipse安装历史记录,因为我们的基础更新站点仅指向最新版本,或者根本不存在5.5.1.final的旧更新站点。 (我们没有进一步调查)

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

环境详情:

(......可能会找到其他工作解决方案的原因。)

对于我们来说, org.slf4j.Logger 的使用( slf4j-api-1.7.5.jar slf4j-simple构建路径中的-1.7.5.jar 或者都已删除 - 无关紧要......只需在没有重新启动Eclipse的情况下关闭并重新打开所有报告)

使用 eclipse.ini jvm选项-verbose:class运行Eclipse会显示冲突可能与此其他已加载的类有关(无论何时加载(可能由jasper预览编辑器本身使用) :eclipse/plugins/org.slf4j.api_1.7.2.v20121108-1250.jar

假设Jasper从v6开始使用SLF4J,并且不会将其报表特定类/ libs 的类加载与其自己的类版本(或Eclipse安装提供的类加载器)中的单独类加载器隔离开来)因此可能会导致这种连锁错误(例如How to deal with LinkageErrors in Java?。)。

已经有一个已知的已解决的错误6.0.4(我添加了这些信息),但显然没有解决: http://community.jaspersoft.com/jaspersoft-studio/issues/3831#comment-818386

答案 2 :(得分:0)

(Whoo ...最后至少有一个可接受的解决方法,因为这个 groovy类加载问题 已经找到了)

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

  • 使用上述的scriptlet

    • 或者会使用/调用任何其他你会遇到问题的java类
  • 将其设为language=java

    • (建议其他网站从language=groovy切换到java以摆脱上述错误,但这通常不是一种选择)

(现在它应该在Preview

中正常运行

每次遇到此错误(由于类加载可能是正确的,可能是随机的,具体取决于您之前在IDE中执行的操作),现在我们可以执行以下操作:

  1. 打开hlprep.jrxml

    • 最多使用Open with ... JasperReports Preview(因此您无需在后续步骤中明确打开预览)
  2. 重启您的Eclipse

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

    • 现在正确进行类加载(由'java'上下文触发)
  4. 选择/预览(已经打开)其他失败的报告

  5. 即使在更改后也应该正常运行,但如果再次打开/关闭新的,则可能会失败。 (因为类可能会被回收,或者groovy类加载器隔离魔法加载它不同)

    我们的环境

    • Eclipse Neon 3
      • 在内部使用 Groovy 2.4.5
      • JDK 1.8.0_121
      • 开头
    • Jaspersoft Studio 6.3.2.final
      • 我们有 6.3.0 服务器,但在 6.3.1 中添加了完整的Neon支持,因此我们采用 6.3.x的最后一个补丁版本< / em>的
      • 我们之前遇到的问题是较新的工作室版本不适用于较旧的服务器,因此我们对此处的升级更加谨慎
    • 可能无关紧要:
      • 仅仅依赖于pom.xml
      • 中的slf4j api(在我们的例子中是 1.7.12
      • 我们都提供了添加到项目中的jasper库:Jaspersoft Server LibraryJasperReports Library Dependencies
      • 我们还依赖于服务器功能,因此我们jasperreports-6.3.0.jar中有pom.xml,有些(不是通过某些公共Maven仓库可用)服务器jars 为{{1到项目(我们从服务器复制)
      • User Library
      • 中没有常规引用