7

fop-1.0 から ikvm を使用して 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();
メソッドのコードは次のとおりです。

        public static void 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 の値を設定します
                    if (引数 != null)
                    {
                        IList キー = 引数.GetKeyList();
                        foreach (var key in keys)
                        {
                            オブジェクト値 = 引数[キー];
                            トランスフォーマー.setParameter(key.ToString(), 値);
                        }

                    }

                    // XSLT 変換の入力を設定
                    ソース src = 新しい StreamSource(xmlfile);

                    // 結果の SAX イベント (生成された FO) は、FOP にパイプする必要があります
                    結果 res = new SAXResult(fop.getDefaultHandler());

                    // XSLT 変換と FOP 処理を開始
                    トランスフォーム (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 に基づく)。次のjarを含めました。

avalon-framework-4.2.0.jar
バティック-オール-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 を呼び出します) {DLLsharedFop を呼び出すことができる DLL がいくつかあります}
  • DLLsharedFop (fop.dll を直接呼び出します。または - 私は気にしません - MyFopWrapper を呼び出す可能性があります)

残念ながら、この構造はエラーになります。
ペア (ACmdLinePrg,MyFopWrapper) に短縮できます: 既にこれは機能しません! しかし (MyMainPrg,MyFopWrapper) は...

4

4 に答える 4

0

作業ディレクトリに欠落しているクラスの dll がありますか?

dll がある場合は、クラスローダーの問題です。IKVM wikiを見てください。多くの場合、BootClassPathAssemby が役立ちます。

于 2011-10-20T18:02:00.983 に答える