7

我用 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,则一切正常。
如果我在类库中使用它,我会收到以下错误:

javax.xml.transform.TransformerFactory.newInstance() 处的“未找到提供程序 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl”

代码行是:

TransformerFactory 工厂 = TransformerFactory.newInstance();
下面是方法的代码:

        公共静态无效 xmlToPDF(字符串 xmlPath,字符串 xslPath,SortedList 参数,字符串 destPdfPath)
        {
            java.io.File xmlfile = new java.io.File(xmlPath);
            java.io.File pdffile = new java.io.File(destPdfPath);
            尝试
            {
                // 根据需要配置 fopFactory
                FopFactory fopFactory = FopFactory.newInstance();

                FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
                // 根据需要配置 foUserAgent

                // 设置输出
                OutputStream outputStream = new java.io.FileOutputStream(pdffile);
                outputStream = new java.io.BufferedOutputStream(outputStream);

                尝试
                {
                    // 构造具有所需输出格式的 fop
                    Fop fop = fopFactory.newFop("application/pdf" /*MimeConstants.MIME_PDF*/, foUserAgent, outputStream);

                    // 设置 XSLT
                    TransformerFactory 工厂 = TransformerFactory.newInstance();

                    java.io.File xsltfile = new java.io.File(xslPath);
                    变压器变压器 = factory.newTransformer(new StreamSource(xsltfile.getAbsoluteFile()));

                    // 设置样式表中a的值
                    如果(参数!= null)
                    {
                        IList 键 = arguments.GetKeyList();
                        foreach(键中的var键)
                        {
                            对象值 = 参数 [键];
                            transformer.setParameter(key.ToString(), value);
                        }

                    }

                    // 为 XSLT 转换设置输入
                    源 src = new StreamSource(xmlfile);

                    // 产生的 SAX 事件(生成的 FO)必须通过管道传送到 FOP
                    结果 res = new SAXResult(fop.getDefaultHandler());

                    // 开始 XSLT 转换和 FOP 处理
                    变压器.transform(src, res);
                }
                捕获(异常 e1)
                {
                    System.Console.WriteLine(e1.Message);
                }
                最后
                {
                    outputStream.close();
                }

            }
            捕捉(例外前)
            {
                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
序列化程序-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 应用程序和类库之间的行为不同?

2011 年 10 月 19 日补充:
我设法完成了以下工作:

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

但就我而言,这不是解决方案,因为在我的目标项目中,我具有以下结构:

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

不幸的是,这种构造会导致错误。
您可以缩短为一对(ACmdLinePrg,MyFopWrapper):这已经不起作用了!但是 (MyMainPrg,MyFopWrapper) 确实...

4

4 回答 4

5

这是我如何得到该错误以及如何解决的:

我的解决方案如下所示:

ClientApp (references)--> ClassLibrary1

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

但是在运行时,情况就不同了。我遇到了同样的异常,并意识到 ClientApp 还需要引用包含“ com.sun.org.apache.xalan.@internal.xsltc.trax ”命名空间的正确 IKVM dll ( IKVM.OpenJDK.XML.Transform.dll )。

于 2017-02-08T13:53:24.087 回答
3

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

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

如此处所述

于 2016-03-23T15:26:03.640 回答
0

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

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

于 2011-10-20T18:02:00.983 回答
0

我在 C#.NET 应用程序中使用了FOP.dll v1.1.0的NuGet包和v7.1.45的IKVM包。我在 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 at org.apache.avalon.framework.configuration.DefaultConfigurationBuilder..ctor(Boolean enableNamespaces)\r\n at

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

于 2019-11-27T19:44:13.330 回答