FOP / ikvm: error "Provider com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl not found"

I created fop.dll from fop-1.0 using ikvm:

  ikvmc -target: library -reference: IKVM.OpenJDK.Core.dll -recurse: {myPathToJars} \ *. jar -version: 1.0 -out: {myPathToJars} \ fop.dll 


If I use the fop.dll file in a Windows application, everything works fine.
If I use it in a class library, I get the following error:

  "Provider com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl not found" at javax.xml.transform.TransformerFactory.newInstance () 

Code line:

  TransformerFactory factory = TransformerFactory.newInstance (); 
Here is the method code:
  public static void xmlToPDF (String xmlPath, String xslPath, SortedList arguments, String destPdfPath)
         {
             java.io.File xmlfile = new java.io.File (xmlPath);
             java.io.File pdffile = new java.io.File (destPdfPath);
             try
             {
                 // configure fopFactory as desired
                 FopFactory fopFactory = FopFactory.newInstance ();

                 FOUserAgent foUserAgent = fopFactory.newFOUserAgent ();
                 // configure foUserAgent as desired

                 // Setup output
                 OutputStream outputStream = new java.io.FileOutputStream (pdffile);
                 outputStream = new java.io.BufferedOutputStream (outputStream);

                 try
                 {
                     // Construct fop with desired output format
                     Fop fop = fopFactory.newFop ("application / pdf" /*MimeConstants.MIME_PDF*/, foUserAgent, outputStream);

                     // Setup XSLT
                     TransformerFactory factory = TransformerFactory.newInstance ();

                     java.io.File xsltfile = new java.io.File (xslPath);
                     Transformer transformer = factory.newTransformer (new StreamSource (xsltfile.getAbsoluteFile ()));

                     // Set the value of a in the stylesheet
                     if (arguments! = null)
                     {
                         IList keys = arguments.GetKeyList ();
                         foreach (var key in keys)
                         {
                             Object value = arguments [key];
                             transformer.setParameter (key.ToString (), value);
                         }

                     }

                     // Setup input for XSLT transformation
                     Source src = new StreamSource (xmlfile);

                     // Resulting SAX events (the generated FO) must be piped through to FOP
                     Result res = new SAXResult (fop.getDefaultHandler ());

                     // Start XSLT transformation and FOP processing
                     transformer.transform (src, res);
                 }
                 catch (Exception e1)
                 {
                     System.Console.WriteLine (e1.Message);
                 }
                 finally
                 {
                     outputStream.close ();
                 }

             }
             catch (Exception ex)
             {
                 System.Console.WriteLine (ex.Message);
             }
         }

I used ikvm-0.46.0.1 to create the fop.dll file (based on fop 1.0). I have included the following banks:

  avalon-framework-4.2.0.jar
 batik-all-1.7.jar
 commons-io-1.3.1.jar
 commons-logging-1.0.4.jar
 fop.jar
 serializer-2.7.0.jar
 xalan-2.7.0.jar
 xercesImpl-2.7.1.jar
 xml-apis-1.3.04.jar
 xml-apis-ext-1.3.04.jar
 xmlgraphics-commons-1.4.jar

Any idea why this error is occurring? Why is the behavior different from a Windows application and class library?
Addendum 10/19/11:
I managed to work as follows:

  • MyMainPrg (Windows Forms Application)
  • MyFopWrapper (class library calling fop.dll)

But for my case, this is not a solution, because in my target project I have the following structure:

  • MainCmdLinePrg (console application, calls DLL_1)
  • DLL_1 (calls DLLsharedFop) {there are several DLLs that can call DLLsharedFop}
  • DLLsharedFop (calls fop.dll directly or - I don't care - it can call MyFopWrapper)

Unfortunately, this design leads to an error.
You can shorten to a couple (ACmdLinePrg, MyFopWrapper): this does not work already! But (MyMainPrg, MyFopWrapper) does ...

+6
source share
3 answers

I solved a similar problem by adding the following before the problematic line:

var s = new com.sun.org.apache.xerces.@internal.jaxp.SAXParserFactoryImpl (); var t = new com.sun.org.apache.xalan.@internal.xsltc.trax.TransformerFactory Impl(); 

As described here

+2
source

Do you have a dll with a missing class in your working directory?

If you have a dll, this is a problem with the class loader. Check out the IKVM wiki . Often helps BootClassPathAssemby.

0
source

This is how I got this error and how I decided:

My solultion is as follows:

 ClientApp (references)--> ClassLibrary1 

My public ClassLibrary1 functions use, but do not expose, objects related to IKVM, so the caller (ClientApp) does not need to add IKVM links. All is well at compile time.

However, at runtime, the situation is different. I got the same exception and realized that ClientApp also needed to reference the correct IKVM dll ( IKVM.OpenJDK.XML.Transform.dll ) that contains " com.sun.org.apache.xalan. @ Internal.xsltc.trax ".

0
source

Source: https://habr.com/ru/post/899514/


All Articles