FOP / ikvm: ошибка «Поставщик com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl не найден» - PullRequest
6 голосов
/ 18 октября 2011

Я создал fop.dll из fop-1.0 с ikvm:

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


Если я использую мой fop.dll в приложении Windows, все работает отлично.
Если я использую его в библиотеке классов, я получаю следующую ошибку:

"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 и библиотеки классов отличается?

Дополнение от 19.10.11:
Мне удалось заставить работать следующее:

  • MyMainPrg (приложение Windows Forms)
  • MyFopWrapper (библиотека классов, которая вызывает fop.dll)

Но для моего случая это не решение, потому что в моем целевом проекте у меня есть следующая структура:

  • MainCmdLinePrg (консольное приложение; вызывает DLL_1)
  • DLL_1 (вызывает DLLsharedFop) {есть несколько библиотек DLL, которые могут вызывать DLLsharedFop}
  • DLLsharedFop (вызывает напрямую fop.dll; или - мне все равно - может вызвать MyFopWrapper)

К сожалению, эта конструкция приводит к ошибке.
Вы можете сократить до пары (ACmdLinePrg, MyFopWrapper): уже это не работает! Но (MyMainPrg, MyFopWrapper) делает ...

Ответы [ 3 ]

3 голосов
/ 23 марта 2016

Я решил похожую проблему, добавив перед проблемной строкой следующее:

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

Как описано здесь

2 голосов
/ 08 февраля 2017

Вот как я получил эту ошибку и как ее разрешил:

Мое решение выглядит так:

ClientApp (references)--> ClassLibrary1

Мои публичные функции ClassLibrary1 используют, но не раскрывает любые объекты, связанные с IKVM, поэтому вызывающей стороне (ClientApp) не нужно было добавлять ссылки IKVM.Все хорошо во время компиляции.

Однако во время выполнения ситуация другая.Я получил то же исключение и понял, что ClientApp также должен ссылаться на правильный IKVM dll ( IKVM.OpenJDK.XML.Transform.dll ), который содержит " com.sun.org.apache.xalan.@ internal.xsltc.trax"пространство имен.

0 голосов
/ 20 октября 2011

У вас есть dll с отсутствующим классом в вашем рабочем каталоге?

Если у вас есть dll, то это проблема загрузчика классов.Посмотрите в IKVM wiki .Часто справка BootClassPathAssemby.

...