- - PR -
JDK1.4上でのJUnitの動作
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2002-05-20 19:56
こんにちは、いつも参考にさせていただいております。
これまでJUnit3.7をJDK1.3.1で動かしてテストを行っていたのですが、 そろそろJDK1.4を使ってみようと思いJDKを1.4に変更しました。 そしてこれまで古いバージョンのXercesを使っていたので これを機にJAXPからXercesを使おうと思い、 そのためのクラスを作ってテストケースを書いて JUnitを走らせてみたのですが動きません。 JUnitは起動するのですが、テストを走らせると以下のようなエラーが出力されます。 しかし、Xmlクラスのメインメソッドを実行するとうまくいくのです。 java.lang.LinkageError: Class org/xml/sax/InputSource violates loader constraints at java.lang.ClassLoader.findBootstrapClass(Native Method) at java.lang.ClassLoader.findBootstrapClass0(ClassLoader.java:730) at java.lang.ClassLoader.loadClass(ClassLoader.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:299) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265) at java.lang.ClassLoader.loadClass(ClassLoader.java:262) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:322) at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) at Xml.<init>(Xml.java:15) at XmlTest.testXml(XmlTest.java:9) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ------------------------------------------- import java.io.*; import javax.xml.parsers.*; import org.xml.sax.InputSource; import org.w3c.dom.*; public final class Xml { private Document doc; private Element root; public Xml( String file ) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); FileInputStream fis = new FileInputStream( file ); InputStreamReader isr = new InputStreamReader( fis ); this.doc = db.parse( new InputSource( isr ) ); this.root = doc.getDocumentElement(); } catch( Exception e ) { System.out.println( e.getMessage() ); } } public Document getDocument() { return( doc );} public Element getRoot() { return( root );} public static void main( String args[] ) { Xml x = new Xml( "C:/java_tools/test/test.xml" ); Element e = x.getRoot(); Element e2 = ( Element )e.getElementsByTagName( "test" ).item( 0 ); System.out.println( e2.getAttribute( "value" ) ); // ↑"succeed"という文字が出力される } } ------------------------------------------------------ import junit.framework.*; import org.w3c.dom.*; public final class XmlTest extends TestCase { public XmlTest( String name ) { super( name );} public void testXml() { Xml x = new Xml( "C:/java_tools/test/test.xml" ); Element e = x.getRoot(); Element e2 = ( Element )e.getElementsByTagName( "test" ).item( 0 ); assertEquals( "succeed", e2.getAttribute( "value" ) ); } } 申し訳ありませんがどなたか原因・解決法がわかりましたら ご教授いただけないでしょうか。 よろしくお願いいたします。 _________________ 【One step closer to you】Ayumu Kobayashi ayum@na.sakura.ne.jp |
|
投稿日時: 2002-05-20 20:17
>そろそろJDK1.4を使ってみようと思いJDKを1.4に変更しました。
>そしてこれまで古いバージョンのXercesを使っていたので >これを機にJAXPからXercesを使おうと思い、 >そのためのクラスを作ってテストケースを書いて >JUnitを走らせてみたのですが動きません。 たしか,JDK1.4からはorg.sml.saxが含まれるようになったんじゃなかったっけ?そのせいで,パッケージ名が衝突しているのでは.もしそうだとすれば,Xercesを外すとかすれば動くと思います.ちなみにJDK1.4上でJUnitを使う分に関しては問題なく動作しています.(JUnitの全機能をテストしたわけではないが.) |
|
投稿日時: 2002-05-21 01:25
月刊ジャバワールドの2002年6月号の記事
「Java 2 SDKに追加されたXMLパッケージ JAXPの機能を知る、使う」 に、Java 2 SDK 1.4に同梱されるXalan(Ver.2.2.D11)を、最新の Xalan(Ver.2.3.1)に切り替える方法について記載されています。 Java 2 SDK 1.4の"Endorsed Standards Override Mechanizm"を 利用する方法で、以下の2種類の指定方法があります。 (1) <java-home>\\lib\\endorsed にJARファイルを置く (2) システムプロパティjava.endorsed.dirsにJARファイルが置かれた ディレクトリを指定する http://java.sun.com/j2se/1.4/docs/guide/standards/index.html これを用いてXercesのクラスライブラリファイルを指定すれば よさそうです。 |
|
投稿日時: 2002-05-21 10:52
悪夢を統べるものさん、ToGoさん、返答ありがとうございます。
まず悪夢を統べるものさんの仰る通り、xercesを外してやってみたところ、 今度はorg.w3c.dom.Node等の基本的なインターフェースが見つからないらしく NoClassDefFoundErrorが出て動かなくなってしまいました。 ので、それならとcrimsonのjarファイルを落としてきて入れてみたのですが、 今度はNode等は見つかるようになったものの、 やはりxercesの時と同じエラーが出て落ちてしまいます。 今度はTogoさんの仰るように JDK1.4のEndorsedStandardsOverrideMechanismを使って Xercesを指定してみようと試みたのですが、 %JAVA_HOME%\\jre\\libにendorsedというディレクトリを作って そこにxercesImpl.jarとxmlParserAPIs.jarを入れてみても やはり同じエラーが出てしまいます。 (%JAVA_HOME%\\libにendorsedに置いてみても同じ) http://java.sun.com/j2se/1.4/docs/guide/standards/index.html を読む限り、java.endorsed.dirsが指定されている場合 そこのプロパティを読むだけでendorsedディレクトリは 読みに行かないような印象を受けたのですが、 もしjava.endorsed.dirsにXercesを指定してあげたい場合は どのようにやればよいのでしょうか。 度々申し訳ありませんがよろしくお願いします。 |
|
投稿日時: 2002-05-21 19:35
自己レスになりますが、これはどうやらJDK1.4というよりは
JAXPとJUnitの相性の問題のようです。 JDK1.3.1でもJAXPを使うと上記のような問題が出てきます。 どうにかJAXPとJUnitを共存させる方法はないものでしょうか。 それとも単に私の設定か何かが悪いだけなのでしょうか。 どなたかJUnitでJAXPを使用する プログラムのテストを行っている方いらっしゃいませんか? |
|
投稿日時: 2002-05-21 23:52
>もしjava.endorsed.dirsにXercesを指定してあげたい場合は
>どのようにやればよいのでしょうか。 システムプロパティなので、コマンドラインオプションで指定する 方法とプログラム中に記述する方法があります。Xercesを例えば C:\java\xerces-2_0_1 にインストールしている場合は、 java -Djava.endorsed.dirs=c:\java\xerces-2_0_1 Xml とプログラムを起動する際にコマンドラインで指定します。 指定したディレクトリの中にあるJARファイルを対象としています。 |
|
投稿日時: 2002-06-19 16:53
現在、JDK1.3.1_02、JUnit3.7、JAXP1.1.3という環境で開発を行っております。
実行時クラスパスの指定で、JUnit.jarよりも前にcrimson.jarとxalan.jarを 指定すれば問題なく動作しています。 JDKのバージョンが違うのですが、JUnitとJAXPの問題なら、これで解決しませんか? |
1
