- ベストアンサー
XML.XSLT
自分で解決ができないので、少し聞かせてください。 質問は、XMLを利用して、XSLTの出力です。 まずは、サンプルでの実装を確認しようと思いまして、 http://www.hellohiro.com/xslt.htm のサイト利用させていただいております。 それで、サイトの説明通り、 http://java.sun.com/xml/downloads/javaxmlpack.html から、java_xml_pack-summer02_01.zipをダウンロードして、xalan.jar、jaxp-api.jar、dom.jar、sax.jar、xercesImpl.jarを配置しました。配置内容は、まず、 C:\jdk1.3\jre\lib\ext に配置しました。そして、サーバアプリは、JRun3.0を使用してますので、C:\Program Files\Allaire\JRun\lib\ext に配置しました。余談になると思うのですが、toolで、forte for java2.0を使っているので、C:\forte4j\lib\extにも配置しました。そして、上記サイトの下方の「サーブレットを利用しての表示」のコードをコンパイルは成功したのですが、ブラウザからの呼び出しでは、真っ白な表示になってしまいます。 自分では、CLASSPATHに問題があるのでは?と思い、いろいろ試したのですがダメです。ちなみに、autoexec.batには、 SET PATH=c:\jdk1.3\bin;%PATH% SET CLASSPATH=.;C:\jdk1.3\jre\lib\ext\xalan.jar;C:\jdk1.3\jre\lib\ext\jaxp-api.jar;C:\jdk1.3\jre\lib\ext\sax.jar;C:\jdk1.3\jre\lib\ext\domjar としています。 どこの設定が間違っているのか、助言をください。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
user.javaargs= -Djavax.xml.parsers.SAXParserFactory= org.apache.xerces.jaxp.SAXParserFactoryImpl HelloWorldXSLTServlet この最後のクラス名はいりません。 user.javaargs= -Djavax.xml.parsers.SAXParserFactory= org.apache.xerces.jaxp.SAXParserFactoryImpl だけでよいです。 システムプロパティの解除、という発想は、 システムプロパティを少々勘違いしていると思います。 とりあえず、解除というのは考える必要はありません。
その他の回答 (5)
- Harry_
- ベストアンサー率55% (36/65)
遅くなってしまいました。すいません。 JRUNが使用するパーサを指定するなんていうこと はないと思いますし、それはそれで解決方法はあると 思いますが、とりあえず別の解決法を。 JAXPはパーサを容易に変更できると書きましたが、 どうやるかというと、システムプロパティを使います。 java コマンドに -D オプションを指定することで システムプロパティを設定できますが、ここで、 java -Djavax.xml.parsers.SAXParserFactory= org.apache.xerces.jaxp.SAXParserFactoryImpl XXX(実行するクラス) というふうに、(改行はいれない) javax.xml.parsers.SAXParserFactory という名前のプロパティに Xerces のファクトリクラス名 を指定すれば使用するパーサが変更されます。 JRun を使用してるということで、 JRun の起動スクリプトを利用してると思いますが、 それをシステムプロパティを指定するよう書き換えて みるとどうでしょう。
補足
>遅くなってしまいました。すいません。 いえいえとんでもありません。 こちらこそ、何日にも渡り回答ありがとうございます。 今回まず、試した事は、JRun ではなくコマンドプロンプトから、システムプロパティの操作をしてみました。 Harry さんのおっしゃる、-D オプションです。 やはり、試したのは、http://www.hellohiro.com/xslt.htm のサイトの前半部分です。これは、なんの問題もなくキチンと動きました。 そして、1つ気になったのですが、システムプロパティの設定は、やはり上記関連サイトのhttp://www.hellohiro.com/systemproperty.htm で調べたのですが、この設定を解除する方法は、どうするのでしょうか・・・? そして、本題の JRun でのシステムプロパティなのですが、やはり設定を施すと、 JRun が起ち上がらなくて、エラーメッセージで Java Virtual Machine Launcher Could not find the main class.Program will exit! と出てしまいます。 設定した内容は、理解が間違っているかもしれませんが、JRun(3.0) では、JMC(JRun Management Console) で設定をします。 (参考なのですが、http://jrun.itfrontier.co.jp/docs/jrun31j/html/JRun_Advanced_Configuration_Guide/isps4.html の中ほどの"JMC での Java 引数の変更"のような画面です。) そして、なぜこの設定をここで行うかと知ったサイトは、http://www.tsuhtan.net/java/pja/how-to.html です。 で、JMC での設定後、local.properties で確認もしたのですが、結果、JRun が起ち上がりません・・・。 local.properties の設定内容は、 # extra virtual machine args user.javaargs=-Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl HelloWorldXSLTServlet です。 どこか設定が間違っていますかね・・・? それとも、JRun の扱いが違っているのかも知れません。 今の状況は、以上なのですが、自分でももっと、調べてみるつもりです。 また、気になる点がありましたら、ご助言よろしくお願いします。
- Harry_
- ベストアンサー率55% (36/65)
JRun のディレクトリに jaxp.jar というのが あるように思いますが。。。 簡単に説明すると(それでも長いですが) xerces は XML を解析するパーサの一種です。 そして、パーサには他にも色々な製品がありますが、 何か XML を利用するアプリケーションを作成したとき、 あとでパーサだけ別の製品と交換したい、といったことが 柔軟にできるよう、JAXP という API があります。 JAXP の SAXParserFactory と SAXParser を使用することで、 実際のパーサが何であっても、同じコードで XML の解析を 行うことができるようになっています。 たとえば、私の環境で次のコードを実行すると、 SAXParserFactory factory = SAXParserFactory.newInstance(); System.out.println(factory.newSAXParser().getClass()); 次のように出力されます。 class org.apache.crimson.jaxp.SAXParserImpl これは、私の環境が J2SDK1.4 で、1.4 にはデフォルトで crimson というパーサが組み込まれているからです。 ところで、tosio_s さんのスタックとレースに次のような部分があります。 at com.sun.xml.parser.SAXParserImpl.<init>(SAXParserImpl.java:60) この SAXParser は JAXP 自体に組み込まれているパーサです。 JAXP はそれ自体では XML 解析の機能をもっていないので、 一応簡単なパーサが組み込まれているのでしょう。 つまり、言いたいのは tosio_s さんの環境では xerces が認識されていないということです。 xerces が認識されていれば、ここは xerces に含まれる クラスの名前が出てくるはずなんです。 これは、sun の URL からダウンロードした JAXP の jar ファイルを使用してるからで、それらを全て、 xerces に付属のものに置き換えれば直るはずなんです。 そして、どうして xerces でなければまずいのかというと、 たとえば <xsl:template> の : の前の xsl の部分を、 名前空間(name space)といいますが、これの解析機能が、 sun の適当につくられてるパーサには含まれてないようだからです。 上でパーサのクラス名を出力するコードを書きましたが、 これが xerces のクラスを表示するようにならないと いけません。 やらないといけないことは、やはり前回の回答と同じです。 JAXP 関係の jar は一度全て削除することです。 環境を一度作り直すのがよいかもしれません。
補足
すごくわかりやすい回答、何度もありがとうございます。 結果からいくと、JRun の jaxp.jar を削除して、JRunを起ち上げようとすると、小さいウインドウで、 JRunが異常終了しました。 JRunのイベントログファイルを確認してください。 と出て、JRunが起ち上がりません。 そこで、イベントログファイルを見ると、 06/10 12:16:45 info (JRun) url を破棄しています 06/10 12:16:45 info (JRun) mail を破棄しています 06/10 12:16:45 info (JRun) web を破棄しています 06/10 12:16:45 info (JRun) jdbc を破棄しています 06/10 12:16:45 info (JRun) jndi を破棄しています 06/10 12:16:45 info (JRun) jms を破棄しています 06/10 12:16:45 info (JRun) ejb を破棄しています 06/10 12:16:45 info (ejb) Server stopped 06/10 12:16:45 info (JRun) control を破棄しています 06/10 12:16:45 info (JRun) license を破棄しています 06/10 12:16:45 info (JRun) monitor を破棄しています 06/10 12:16:45 info (JRun) logging を破棄しています 06/10 12:16:45 info (JRun) scheduler を破棄しています と出ます。 自分自身、考えたのですが、これは、JRun が jaxp.jar がないと(読まれないと)、起ち上がらない仕様になっていて、「他のパーサじゃダメだよ。」と言っていると思うのですが・・・。 ってことは、結局、JRun3.0では、XMLを操作できないってことになると思うのですが・・・。 話が、最初に戻るのですが、 http://www.hellohiro.com/xslt.htm の解説は、結局、Tomcat での設定で、Tomcat は柔軟なアプリサーバで、sun の jaxp.jar でも XML を扱えるけど、今回の JRun では、ちょっとムリ・・・。という事になると思うのですが・・・。 それと、こういう状態が出た以上、アプリサーバ JRun からの移行が必要ですね・・・。 そして、J2SDK も 1.4 へのバージョンアップも・・・。 お時間許しましたら、ご助言よろしくお願いします。
- Harry_
- ベストアンサー率55% (36/65)
まず、クラスパスの通ったディレクトリから、 質問で挙げた jar のうち、xalan.jar を除くものを 全て削除してください。 /jre/lib/ext の下も、JRun の下もです。 CLASSPATH 変数で xercesImpl.jar や jaxp-api.jar が 指定されていないかも確認してください。 そして、そのかわりに、 参考URLは Xerces の HP ですが、 ここから、Xerces-J-bin.2.4.0.zip を DL し、 それを解凍してでてくる xercesImpl.jar xml-apis.jar を、配置してください。 これで直りませんか? 直ったらちょっと説明を加えます。
補足
何度も、回答ありがとうございます。 結果からいくと、やはり真っ白な画面になってしまいます。 Harryさんの回答通り、配置をしたのですが・・。 他、jarファイルが邪魔をしているのですかね・・・? 今の状態をもう一度書きます。 Forte C:\forte4j\lib\ext のディリクトリ内・・・ xercesImpl.jar xml-apis.jar xalan.jar postgresql.jar javac.jar AbsoluteLayout.jar icebrowserlitebean.jar jaxp.jar jh.jar parser.jar parser_ja.jar regexp.jar servlet.jar jdk C:\jdk1.3\jre\lib\ext のディリクトリ内・・・ xalan.jar xercesImpl.jar xml-apis.jar JRun3.0 C:\Program Files\Allaire\JRun\lib\ext のディリクトリ内・・・ xercesImpl.jar xml-apis.jar xalan.jar servlet.jar iioprt.jar pop3.jar ejb.jar jms.jar jta.jar activation.jar jaxp.jar jdbc.jar jndi.jar mail.jar parser.jar です。Forteはこの配置で、コンパイルし直しました。 autoexec.bat は、SET PATH=c:\jdk1.3\bin;%PATH% だけです。 なるべく自分でも解決策をと考えたのですが・・・。 補足遅れまして・・・。 今さらなのですが、環境は、win98seです。 またの回答よろしくお願いします。
- Harry_
- ベストアンサー率55% (36/65)
jre/lib/ext に配置した jar ファイルは java の起動時にクラスパスに追加されますので、 自分で設定する必要はありません。(しないほうがよいと思います) また、サーブレットコンテナは独自のクラスローダで クラスをロードしますので、これも、コンテナが 指定したディレクトリに配置しさえすれば、 ちゃんと認識してくれます。 それより、表示が真っ白というのは当然 どこかでエラーが起きているわけですが、 それがどこかをまず特定したほうがいいです。 コンソールにスタックトレースは出てませんか? 出てないなら、どこか例外を無視している箇所はありませんか? それもなければ、一度地道にデバッグメッセージを あちこちにいれて場所を特定するとよいでしょう。
補足
回答ありがとうございます。 最初に、CLASSPATHなんですが、自分も http://java-house.jp/ml/archive/j-h-b/021880.html#body の項目の、15を見て配置処理だけでいいと思ってたのですが、真っ白の画面がでるので、CLASSPATHだと勘違いしてました。 そして、javaに従事しいるのに、スタックトレースの出し方について無知です。調べたのですが、この調べた結果が、「スタックトレースを吐き出しているメッセージ」と断言はできません。調べた方法は、 http://jrun.itfrontier.co.jp/docs/jrun31j/html/Developing_Applications_with_JRun/debug2.html の「ウインドウズのスタックトレース」なのですが、この中の項目の、3,での ctrl-Break が効きません。なので、単純に、項目4,での作業をして、スタックトレースを取ったつもりです・・。もちろん名前には、defaultサーバで作業を行っているので、nameの所は、defaultのスタックトレースを取りました。ディリクトリで書きますと、 C:\Program Files\Allaire\JRun\logs\default-err.log です。そこから気になった所を少し、書き出すと javax.xml.parsers.ParserConfigurationException: Namespace not supported by SAXParser at com.sun.xml.parser.SAXParserImpl.<init>(SAXParserImpl.java:60) at com.sun.xml.parser.SAXParserFactoryImpl.newSAXParser(SAXParserFactoryImpl.java:57) at org.apache.xalan.processor.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:948) at org.apache.xalan.processor.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:799) at HelloWorldXSLTServlet.service(HelloWorldXSLTServlet.java:21) と org.xml.sax.SAXException: Namespace not supported by SAXParser at org.apache.xalan.processor.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:954) at org.apache.xalan.processor.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:799) at HelloWorldXSLTServlet.service(HelloWorldXSLTServlet.java:21) の2か所なのですが、自分では、SAXのパーサが例外を起している感じがするのですが・・・。でも、SAXの技術なんか使ってない気もするのですが・・・。 大変レベルの低い補足ですが、指摘いただけたらと思ってます。よろしくお願いします。
- shiro-hase
- ベストアンサー率39% (34/86)
こんにちは。 CLASSPATHの設定ですが、ファイル名を直接指定してますよね? これだと、たとえば、c:\...\ext\内のほかの.jarファイルにアクセスできなくなるはずです。 ですから、SET CLASSPATH=c:\...\extで試してみてください。 参考になれば、幸いです。
お礼
長期の回答ありがとうございました。 結果、XML,XSLT の実装ができるようになりました。 調べてるうちに、このページで解決に至りました。 http://sirius.itfrontier.co.jp/kb/jrun_article.cfm?TYPE=en&ID=22729 そして、このページの最後の最下記の、「関連リンク」のページの下記の「代替手段」です。 結局、crimson.jar、xalan.jar の二つの .jar を C:\jdk1.3.0_02\jre\lib\ext に置く事により、解決しました。上記、「XML/XSLTの更新・・・」のページの説明通り試してもなかなか実装しなくて困っていました。 今回は、本当に長期に渡って、回答ありがとうございました。