我用 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) 确实...