如何将动态 Jasper 实现为 JBoss AS 7.2 静态模块?

How to implement Dynamic Jasper as JBoss AS 7.2 Static Module?

我已经成功地将 Jasper Report 作为模块实现,但是在实现 DynamicJasper 时我失败了几次。

我正在使用 JBoss AS 7.2、Linux CentOS 内核 2.6.32-431.el6.x86_64 和 Java 1.7[=15 尝试此实现=]

下面是我创建的module.xml

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="other.tool.dynamicJasper">
  <resources>
    <resource-root path="DynamicJasper-5.0.11.jar"/>
  </resources>
  <dependencies>
    <module name="net.sf.jasper.reports"/>
    <module name="org.apache.commons.logging" />
    <module name="org.apache.commons.collections" />
    <module name="org.apache.commons.beanutils" />
    <module name="org.eclipse.jdt" export="true"/>
    <module name="com.lowagie.itext" />
    <module name="org.apache.poi" />
    <module name="org.apache.commons.digester" />
    <module name="org.jfree.chart" />
    <module name="javax.api"/>
    <system export="true">
      <paths>
        <path name="net/sf/jasper/reports"/>
      </paths>
    </system>
  </dependencies>
  <properties>
    <property name="net.sf.jasperreports.compiler.keep.java.file" value="true"/>
    <property name="net.sf.jasperreports.compiler.classpath" value="/usr/share/jboss-as-7-new/modules-agci/net/sf/jasper/reports/main/jasperreports-5.2.0.jar"/>
  </properties>
</module>

这是 Jasper 报告module.xml

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="net.sf.jasper.reports">
  <resources>
    <resource-root path="jasperreports-5.2.0.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
    <module name="org.apache.commons.logging"/>
    <module name="org.apache.commons.collections"/>
    <module name="org.apache.commons.digester"/>
    <module name="org.apache.commons.beanutils"/>
    <module name="org.eclipse.jdt" export="true"/>
    <module name="net.sf.jasper.reports.fonts" export="true"/>
    <module name="com.lowagie.itext"/>
    <module name="other.fonts.arial"/>
    <module name="other.fonts.times"/>
  </dependencies>
  <properties>
    <property name="net.sf.jasperreports.compiler.keep.java.file" value="true"/>
    <property name="net.sf.jasperreports.compiler.classpath" value="/usr/share/jboss-as-7-new/modules-agci/net/sf/jasper/reports/main/jasperreports-5.2.0.jar"/>
  </properties>
</module>

我总是收到的错误信息是

Errors were encountered when compiling report expressions class file:
/usr/share/jboss-as-7-new/DJR_9154_1554455135225_288300.java:4: error: package net.sf.jasperreports.engine does not exist

当我用top监控的时候,看到javac已经执行了

最终,我成功找到了答案。 根本原因是 jasper-compiler-jdt-5.5.15.jar 与模块 org.jboss.as.web.

中的 ecj-3.7.2.jar 造成的冲突

解决方法是

  • 我合并了两个 JAR 并将其命名为 eclipse-combined-jdt-1.0.0.jar
  • 我修改了module.xmlorg.jboss.as.webnet.sf.jasper.reports

org.jboss.as.web的修订为

<resources>
  <resource-root path="jboss-as-web-7.2.0.Final.jar" />        
  <resource-root path="jbossweb-7.2.0.Final.jar" />        
  <resource-root path="eclipse-combined-jdt-1.0.0.jar" />
</resources>

net.sf.jasper.reports的修订为

    <dependencies>
      <module name="javax.api"/>
      <module name="org.apache.commons.logging"/>
      <module name="org.apache.commons.collections"/>
      <module name="org.apache.commons.digester"/>
      <module name="org.apache.commons.beanutils"/>
      <module name="net.sf.jasper.reports.fonts" export="true"/>
      <module name="com.lowagie.itext"/>
      <module name="other.fonts.arial"/>
      <module name="other.fonts.times"/>
      <module name="org.jfree.chart"/>
      <module name="org.jboss.as.web">
        <imports>
          <include-set>
            <path name="org/eclipse/jdt/internal/compiler" />
          </include-set>
        </imports>
      </module>
    </dependencies>