Reputation: 894
I want to display PDF file by using fop-1.1. jar and xmlgraphics-commons-1.5.jar based on JRE 1.6. But I have an exception as below:
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)
and 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();
line 150 refer on log is
transformer.transform(src, res);
and class path:
<?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>
Researching on internet, I add particular fop-1.1.jar based on link
but the issue still happens. Please advise me.
Upvotes: 0
Views: 2296
Reputation: 51
I had the same problem to use FOP on my JSP file and i had to search for .jar to add to make it works like those :
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
i don't know if it is of any help ... i can give you my import header of my JSP file too if you want to..
And like SantiBailors said : Welcome to JAR hell o/
Upvotes: 0
Reputation: 1634
NoSuchMethodError
is thrown when a class used at runtime doesn't contain a method that the class contained at compile time, and that method gets called. The compilation succeeds but at runtime a different version of the class is found on the classpath, and that class has the same qualified name and it doesn't contain that method, and that class is used, and of course the method is not found in it.
This is often caused by some JAR that contains a different version of a library that you are using. When you compile, the right library is used (you probably imported it yourself into the project), but at compile time the wrong library - contained in some JAR found on your classpath - is found and used.
To verify from what JAR file your org.apache.xmlgraphics.xmp.Metadata
class is taken at runtime, you can run your program adding the JVM argument -verbose:class
which will output to the console the information of where the Metadata
class is taken from at runtime. You will see that it's taken from a different location than the one where it's taken from at compile time, and the runtime one will lack the mergeInto
method.
Once you know where the wrong class is taken from at runtime, the fix will depend on what that is, which build system you are using, which libraries are involved etc., but it will consist of making so that the wrong class is no longer used except by the code from the JAR that contains it.
In any case, welcome to JAR hell :-)
Upvotes: 2