与Fop库的NoSuchMethodError

时间:2017-02-23 11:47:45

标签: java classpath apache-fop

我想使用fop-1.1显示PDF文件。 jar和基于JRE 1.6的xmlgraphics-commons-1.5.jar。但我有一个例外如下:

EXCEPTION]
java.lang.NoSuchMethodError: org.apache.xmlgraphics.xmp.Metadata.mergeInto(Lorg/apache/xmlgraphics/xmp/Metadata;)V
at org.apache.fop.render.pdf.PDFRenderingUtil.renderXMPMetadata(PDFRenderingUtil.java:356)
at org.apache.fop.render.pdf.PDFDocumentHandler.handleExtensionObject(PDFDocumentHandler.java:290)
at org.apache.fop.render.intermediate.util.IFDocumentHandlerProxy.handleExtensionObject(IFDocumentHandlerProxy.java:197)
at org.apache.fop.render.intermediate.IFRenderer.startPageSequence(IFRenderer.java:519)
at org.apache.fop.area.RenderPagesModel.startPageSequence(RenderPagesModel.java:97)
at org.apache.fop.layoutmgr.PageSequenceLayoutManager.activateLayout(PageSequenceLayoutManager.java:104)
at org.apache.fop.area.AreaTreeHandler.endPageSequence(AreaTreeHandler.java:267)
at org.apache.fop.fo.pagination.PageSequence.endOfNode(PageSequence.java:128)
at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.endElement(FOTreeBuilder.java:347)
at org.apache.fop.fo.FOTreeBuilder.endElement(FOTreeBuilder.java:181)
at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.endElement(ToXMLSAXHandler.java:261)
at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.endElement(ToXMLSAXHandler.java:555)
at letter_EN_Salaried.template$dot$0()
at letter_EN_Salaried.applyTemplates()
at letter_EN_Salaried.transform()
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:637)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:758)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:356)
at com.demo.EmployeeProof.doOnNodeReady(EmployeeProof.java:150)

和java class:

HttpServletResponse response = request.getServletResponse(true);

String strXSLPath = Property.strXSLPath;

IJCOClientService clientService = (IJCOClientService) request
        .getService(IJCOClientService.KEY);


    poolEntry = clientService.getJCOClientPoolEntry("SAP_R3_PAYSTUB",
            request);



    this.tFactory = TransformerFactory.newInstance();

    this.fopFactory = FopFactory.newInstance();

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    FOUserAgent userAgent = fopFactory.newFOUserAgent();
    userAgent.getRendererOptions().put(
            "encryption-params",
            new PDFEncryptionParams(null, "password", true, false,
                    false, false));

    Fop fop = fopFactory.newFop(org.apache.xmlgraphics.util.MimeConstants.MIME_PDF, userAgent, out);

    Source xsltSrc = null;
    xsltSrc = new StreamSource(strXSLPath
                    + "demo.xsl");

    Transformer transformer = this.tFactory.newTransformer(xsltSrc);


    Source src = new StreamSource(createXML(poolEntry, request));

    transformer.transform(src, res);

    response.setContentType("application/pdf");
    response.setContentLength(out.size());

    response.getOutputStream().write(out.toByteArray());
    response.getOutputStream().flush();

第150行引用日志是

transformer.transform(src, res);

和类路径:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src.api"/>
    <classpathentry kind="src" path="src.core"/>
    <classpathentry kind="var" path="LIB_HOME/prtapi.jar"/>
    <classpathentry kind="var" path="LIB_HOME/prttest.jar"/>
    <classpathentry kind="var" path="LIB_HOME/com.sap.portal.runtime.application.soap_api.jar"/>
    <classpathentry kind="var" path="LIB_HOME/activation.jar"/>
    <classpathentry kind="var" path="LIB_HOME/com.sap.security.api.jar"/>
    <classpathentry kind="var" path="LIB_HOME/jaxm-api.jar"/>
    <classpathentry kind="var" path="LIB_HOME/mail.jar"/>
    <classpathentry kind="var" path="LIB_HOME/saaj-api.jar"/>
    <classpathentry kind="var" path="LIB_HOME/sapxmltoolkit.jar"/>
    <classpathentry kind="lib" path="xxx/com.sap.portal.runtime.application.jcoclient_api.jar"/>
    <classpathentry kind="lib" path="xxx/com.sap.portal.runtime.application.jcoclient_core.jar"/>
    <classpathentry kind="lib" path="xxx/prtapi.jar"/>
    <classpathentry kind="lib" path="xxx/prtcoreservice.jar"/>
    <classpathentry kind="lib" path="xxx/prtportalservice.jar"/>
    <classpathentry kind="lib" path="xxx/sapjco.jar"/>
    <classpathentry kind="lib" path="xxx/tc_sec_api.jar"/>
    <classpathentry kind="lib" path="xxx/urlgeneratorapi.jar"/>
    <classpathentry kind="lib" path="dist/External_Lib/SP18_libs/clientinfo.jar"/>
    <classpathentry kind="lib" path="dist/External_Lib/SP18_libs/connectorimpl.jar"/>
    <classpathentry kind="lib" path="dist/External_Lib/SP18_libs/jcoclientapi.jar"/>
    <classpathentry kind="lib" path="dist/External_Lib/SP18_libs/landscapeapi.jar"/>
    <classpathentry kind="lib" path="dist/External_Lib/SP18_libs/remote_client.jar"/>
    <classpathentry kind="lib" path="dist/External_Lib/SP18_libs/umapi.jar"/>
    <classpathentry kind="lib" path="dist/External_Lib/SP18_libs/usermanagementapi.jar"/>
    <classpathentry kind="lib" path="dist/External_Lib/SP18_libs/wcmapi.jar"/>
    <classpathentry kind="lib" path="dist/External_Lib/SP18_libs/wcmutil.jar"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/SAP JVM 6 (61_REL i486 opt)"/>
    <classpathentry kind="lib" path="xxx/fop-1.1.jar"/>
    <classpathentry kind="lib" path="xxxcommons-io-1.3.1.jar"/>
    <classpathentry kind="lib" path="xxxxmlgraphics-commons-1.5.jar"/>
    <classpathentry kind="output" path="classes.api"/>
</classpath>

在互联网上进行研究,我根据link

添加了特定的fop-1.1.jar

但问题仍然存在。请建议我。

2 个答案:

答案 0 :(得分:0)

当在运行时使用的类不包含该类在编译时包含的方法,并且该方法被调用时,抛出

NoSuchMethodError。编译成功但在运行时在类路径上找到了不同版本的类,并且该类具有相同的限定名称,并且它不包含该方法,并且使用该类,当然该方法不是在其中找到。

这通常是由某些JAR引起的,包含您正在使用的库的不同版本。编译时,使用正确的库(您可能自己将其导入到项目中),但在编译时,会找到并使用错误的库(包含在类路径中的某些JAR中)。

要验证在运行时从哪个JAR文件中获取org.apache.xmlgraphics.xmp.Metadata类,可以运行程序添加JVM参数-verbose:class,该参数将向控制台输出{{1}的位置信息。 } class是在运行时获取的。您将看到它来自与编译时从其中取出的位置不同的位置,并且运行时将缺少Metadata方法。

一旦你知道在运行时从哪个错误的类中获取,修复将取决于它是什么,你正在使用哪个构建系统,涉及哪些库等,但它将包括使得错误的类除了包含它的JAR中的代码之外,不再使用它。

无论如何,欢迎来到JAR hell: - )

答案 1 :(得分:0)

我在JSP文件中使用FOP时遇到了同样的问题,我不得不搜索.jar来添加它以使它像那样工作:

fop.jar xmlgraphics-commons-2.1.jar batik-1.8.jar batik-bridge-1.8.jar batik-dom-1.8.jar batik-gui-util-1.8.jar batik-script-1.8.jar batik-swing-1.8.jar batik-xml-1.8.jar batik-anim-1.8.jar batik-codec-1.8.jar batik-ext-1.8.jar batik-gvt-1.8.jar batik-svg-dom-1.8.jar batik-transcoder-1.8.jar batik-awt-util-1.8.jar batik-css-1.8.jar batik-extension-1.8.jar batik-parser-1.8.jar batik-svggen-1.8.jar batik-util-1.8.jar

我不知道它是否有任何帮助......如果你愿意,我也可以给你我的JSP文件的导入标题..

和SantiBailors说:欢迎来到JAR地狱o /