FOP / ikvm:错误“未找到提供程序com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl”

时间:2011-10-18 08:01:59

标签: apache-fop ikvm

我使用ikvm从fop-1.0生成了一个fop.dll:

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


如果我在Windows应用程序中使用我的fop.dll,一切都很完美 如果我在类库中使用它,我会收到以下错误:

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

代码行是:

TransformerFactory factory = TransformerFactory.newInstance();
以下是方法代码:

        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);
            }
        }

我使用ikvm-0.46.0.1制作我的fop.dll(基于fop 1.0)。我加入了以下罐子:

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

知道为什么会出现这种错误吗?为什么Windows应用程序和类库之间的行为有所不同?
加法10/19/11:
我成功地完成了以下工作:

  • MyMainPrg(Windows窗体应用程序)
  • MyFopWrapper(一个调用fop.dll的类库)

但对于我的情况,这不是解决方案,因为在我的目标项目中,我有以下结构:

  • MainCmdLinePrg(控制台应用程序;调用DLL_1)
  • DLL_1(调用DLLsharedFop){有几个DLL可以调用DLLsharedFop}
  • DLLsharedFop(直接调用fop.dll;或者 - 我不在乎 - 可能会调用MyFopWrapper)

不幸的是,这种结构会导致错误 你可以缩短成对(ACmdLinePrg,MyFopWrapper):已经不行了!但是(MyMainPrg,MyFopWrapper)确实......

4 个答案:

答案 0 :(得分:2)

我通过在有问题的行之前添加以下内容来解决类似的问题:

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

As described here

答案 1 :(得分:2)

以下是我收到错误的方式以及解决方法:

我的解决方案如下:

ClientApp (references)--> ClassLibrary1

我的ClassLibrary1公共函数正在使用,但是没有公开任何与IKVM相关的对象,因此调用者(ClientApp)不必添加IKVM引用。编译时一切都很好。

然而,在运行时,情况有所不同。我得到了相同的异常,并意识到ClientApp还需要引用包含" com.sun.org的正确IKVM dll( IKVM.OpenJDK.XML.Transform.dll )。 apache.xalan @ internal.xsltc.trax &#34。命名空间。

答案 2 :(得分:0)

你的工作目录中是否有缺少类的dll?

如果你有dll那么这是一个类加载器问题。查看IKVM wiki。通常BootClassPathAssemby帮助。

答案 3 :(得分:0)

我在C#.NET应用程序中使用的 FOP.dll v1.1.0 IKVM 软件包的 NuGet 软件包。我在Windows 2016 x64服​​务器上收到此问题,并显示以下错误消息:

  

------------------------------ Fop.cs(111):提供者com.sun.org.apache.xalan .internal.xsltc.trax.TransformerFactoryImpl   找不到-在javax.xml.transform.TransformerFactory.newInstance()   Fop.cs(125):提供者   找不到com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl   -在javax.xml.parsers.SAXParserFactory.newInstance()\ r \ n在org.apache.avalon.framework.configuration.DefaultConfigurationBuilder..ctor(Boolean   enableNamespaces)\ r \ n位于

     

org.apache.avalon.framework.configuration.DefaultConfigurationBuilder..ctor()\ r \ n

我通过在过程开始时添加这两行来解决了这个问题

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

有用的链接:

  

https://github.com/KevM/tikaondotnet/issues/21