2017-02-23 77 views
0

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

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类:

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> 

在互联网上进行研究,我特别添加了fop-1.1.j ar基于link

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

+0

它看起来像一个版本不匹配,所以只需添加FOP 1.1可能是不够的 - 你可能有FOP的较新或旧版本需要被去除。但我只是猜测,您提供的信息不够,无法了解您的问题。 – Gimby

+0

@Gimby:包含classpath文件。请帮我看看 –

回答

0

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

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

从什么JAR文件的org.apache.xmlgraphics.xmp.Metadata类是采取在运行验证,您可以运行您的程序添加JVM参数-verbose:class将输出到控制台,其中Metadata类是在运行时所采取的信息。你会发现它是从一个不同的位置获得的,而不是它在编译时的位置,而运行时将会缺少方法mergeInto

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

在任何情况下,欢迎JAR hell :-)

0

,我不得不使用FOP在我的JSP文件同样的问题,我不得不寻找的.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蜡染 - 秋千-1.8.jar batik-xml-1.8.jar batik-anim-1.8.jar batik-codec-1.8.jar蜡染-ext-1.8.jar蜡染-gvt-1.8.jar蜡染-svg-dom-1.8.jar蜡染-transcoder-1.8.jar batik-awt-util-1.8.jar batik-css-1.8.jar batik-extension-1.8.jar b atik-parser-1.8.jar batik-svggen-1.8.jar batik-util-1.8.jar

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

而像SantiBailors说:欢迎JAR地狱O/