- PR -

JDK1.4上でのJUnitの動作

1
投稿者投稿内容
ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 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/03/28
投稿数: 255
投稿日時: 2002-05-20 20:17
>そろそろJDK1.4を使ってみようと思いJDKを1.4に変更しました。
>そしてこれまで古いバージョンのXercesを使っていたので
>これを機にJAXPからXercesを使おうと思い、
>そのためのクラスを作ってテストケースを書いて
>JUnitを走らせてみたのですが動きません。

たしか,JDK1.4からはorg.sml.saxが含まれるようになったんじゃなかったっけ?そのせいで,パッケージ名が衝突しているのでは.もしそうだとすれば,Xercesを外すとかすれば動くと思います.ちなみにJDK1.4上でJUnitを使う分に関しては問題なく動作しています.(JUnitの全機能をテストしたわけではないが.)
ToGo
常連さん
会議室デビュー日: 2002/03/16
投稿数: 46
投稿日時: 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のクラスライブラリファイルを指定すれば
よさそうです。
ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 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を指定してあげたい場合は
どのようにやればよいのでしょうか。

度々申し訳ありませんがよろしくお願いします。
ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 2002-05-21 19:35
自己レスになりますが、これはどうやらJDK1.4というよりは
JAXPとJUnitの相性の問題のようです。
JDK1.3.1でもJAXPを使うと上記のような問題が出てきます。
どうにかJAXPとJUnitを共存させる方法はないものでしょうか。
それとも単に私の設定か何かが悪いだけなのでしょうか。
どなたかJUnitでJAXPを使用する
プログラムのテストを行っている方いらっしゃいませんか?
ToGo
常連さん
会議室デビュー日: 2002/03/16
投稿数: 46
投稿日時: 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ファイルを対象としています。
T2
常連さん
会議室デビュー日: 2002/02/20
投稿数: 37
投稿日時: 2002-06-19 16:53
現在、JDK1.3.1_02、JUnit3.7、JAXP1.1.3という環境で開発を行っております。
実行時クラスパスの指定で、JUnit.jarよりも前にcrimson.jarとxalan.jarを
指定すれば問題なく動作しています。
JDKのバージョンが違うのですが、JUnitとJAXPの問題なら、これで解決しませんか?
1

スキルアップ/キャリアアップ(JOB@IT)