我使用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:
我成功地完成了以下工作:
但对于我的情况,这不是解决方案,因为在我的目标项目中,我有以下结构:
不幸的是,这种结构会导致错误 你可以缩短成对(ACmdLinePrg,MyFopWrapper):已经不行了!但是(MyMainPrg,MyFopWrapper)确实......
答案 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();
答案 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();
有用的链接: