Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

DocumentBuilderFactoryエラー

お世話になります。今まで、動作していたのですが、
DocumentBuilderFactory.newInstance();でエラーが発
生し、動作しなくなりました。
DocumentBuilderFactory.newInstance()を呼び出してい
るだけで、エラーが出てしまっているため、どこを修正
してよいのかわかりません。何か情報いただければ、幸
甚です。

import javax.xml.parsers.DocumentBuilderFactory;

DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();

エラー内容↓
Exception in thread "AWT-EventQueue-0" 
javax.xml.parsers.FactoryConfigurationError: 
Factory class is the wrong type
    at 
javax.xml.parsers.DocumentBuilderFactory.newInstan
ce(DocumentBuilderFactory.java:115)

18

回答

86662

閲覧

18件の回答

評価

0

そこはプロパティからクラス名を得て、実クラスを生成して
いるんだよ。
プロパティ値はライブラリ導入で上書きされることもある。
実際に生成されるクラスがないか、バージョンが新しくて
使えないか、そういったところだろう。

評価

0

Exception in thread "AWT-EventQueue-0" 

javax.xml.parsers.FactoryConfigurationError: 

Factory class is the wrong type

と特定できてるんだからあとすこしな

評価

0

JAXP: The property is undefined.
JAXP: found null in $java.home/jaxp.properties
JAXP: no META-
INF/services/javax.xml.xpath.XPathFactory file was 
found
JAXP: attempting to use the platform default W3C 
DOM XPath lib
JAXP: 
createInstance(com.sun.org.apache.xpath.internal.j
axp.XPathFactoryImpl)
JAXP: loaded 
com.sun.org.apache.xpath.internal.jaxp.XPathFactor
yImpl from 
jar:file:/C:/Program%20Files/Java/jre7/lib/rt.jar!
/com/sun/org/apache/xpath/internal/jaxp/XPathFacto
ryImpl.class
JAXP: factory 
'com.sun.org.apache.xpath.internal.jaxp.XPathFacto
ryImpl' was found for 
http://java.sun.com/jaxp/xpath/dom

XPathFactoryImplがCastできていない?
どこを直せば・・・

評価

0

これは  -Djaxp.debug=1 を付けて実行した際のログですよね、内容は
XPathFactory xpathFactory = XPathFactory.newInstance();
みたいにXPathFactoryインスタンスを取得する際のログで、うまく生成されています。
エラーを起こすDocumentBuilderFactoryの方のログを表示してください。
私の環境では
DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();
の部分でエラーは発生せずに以下のようなログになります。
JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
JAXP: loaded from fallback value: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
JAXP: created new instance of class com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl using ClassLoader: null



評価

0

DocumentBuilderFactoryは、以下のとおりで同じです。
JAXP: find factoryId 
=javax.xml.parsers.DocumentBuilderFactory
JAXP: loaded from fallback value: 
com.sun.org.apache.xerces.internal.jaxp.DocumentBu
ilderFactoryImpl
JAXP: created new instance of class 
com.sun.org.apache.xerces.internal.jaxp.DocumentBu
ilderFactoryImpl using ClassLoader: null

追っかけていくと、以下ログの後にエラーが発生してい
ます。

JAXP: no META-
INF/services/javax.xml.xpath.XPathFactory file was 
found
JAXP: attempting to use the platform default W3C 
DOM XPath lib
JAXP: 
createInstance(com.sun.org.apache.xpath.internal.j
axp.XPathFactoryImpl)
JAXP: loaded 
com.sun.org.apache.xpath.internal.jaxp.XPathFactor
yImpl from 
jar:file:/C:/Program%20Files/Java/jre7/lib/rt.jar!
/com/sun/org/apache/xpath/internal/jaxp/XPathFacto
ryImpl.class
JAXP: factory 
'com.sun.org.apache.xpath.internal.jaxp.XPathFacto
ryImpl' was found for 
http://java.sun.com/jaxp/xpath/dom
Exception in thread "AWT-EventQueue-0" 
javax.xml.parsers.FactoryConfigurationError: 
Factory class is the wrong type
    at 
javax.xml.parsers.DocumentBuilderFactory.newInstan
ce(DocumentBuilderFactory.java:115)



javax.xml.xpath.XPathFactory←これが見つけられてい
ない?

評価

0

ログを見る限りDocumentBuilderFactoryもXPathFactoryも正しく生成されているようですね。
試しに下のTestをコンパイルして
java -Djaxp.debug=1 Test
と実行するとどうなりますか?

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathFactory;

public class Test {
    public static void main(String[] args) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        XPathFactory xpathFactory = XPathFactory.newInstance();
    }
}

私の環境では例外は発生せず以下のようなログが出力されます。
JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
JAXP: loaded from fallback value: com.sun.org.apache.xerces.internal.jaxp.DocumntBuilderFactoryImpl
JAXP: created new instance of class com.sun.org.apache.xerces.internal.jaxp.DocmentBuilderFactoryImpl using ClassLoader: null
JAXP: using thread context class loader (sun.misc.Launcher$AppClassLoader@ff057) for search
JAXP: Looking up system property 'javax.xml.xpath.XPathFactory:http://java.sun.om/jaxp/xpath/dom'
JAXP: The property is undefined.
JAXP: found null in $java.home/jaxp.properties
JAXP: no META-INF/services/javax.xml.xpath.XPathFactory file was found
JAXP: attempting to use the platform default W3C DOM XPath lib
JAXP: createInstance(com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl)
JAXP: loaded com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl from jar:fle:/C:/Program%20Files/Java/jre7/lib/rt.jar!/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.class
JAXP: factory 'com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl' was foud for http://java.sun.com/jaxp/xpath/dom

評価

0

新たなPJを立ち上げ、実行しました。エラーはでず、正
常終了しました。ログは、エラーが出たときのログと同
じ様子です。
JAXP: find factoryId 
=javax.xml.parsers.DocumentBuilderFactory
JAXP: loaded from fallback value: 
com.sun.org.apache.xerces.internal.jaxp.DocumentBu
ilderFactoryImpl
JAXP: created new instance of class 
com.sun.org.apache.xerces.internal.jaxp.DocumentBu
ilderFactoryImpl using ClassLoader: null
JAXP: using thread context class loader 
(org.eclipse.core.runtime.internal.adaptor.Context
Finder@61e76ee9) for search
JAXP: Looking up system property 
'javax.xml.xpath.XPathFactory:http://java.sun.com/
jaxp/xpath/dom'
JAXP: The property is undefined.
JAXP: found null in $java.home/jaxp.properties
JAXP: no META-
INF/services/javax.xml.xpath.XPathFactory file was 
found
JAXP: attempting to use the platform default W3C 
DOM XPath lib
JAXP: 
createInstance(com.sun.org.apache.xpath.internal.j
axp.XPathFactoryImpl)
JAXP: loaded 
com.sun.org.apache.xpath.internal.jaxp.XPathFactor
yImpl from 
jar:file:/C:/Program%20Files/Java/jre7/lib/rt.jar!
/com/sun/org/apache/xpath/internal/jaxp/XPathFacto
ryImpl.class
JAXP: factory 
'com.sun.org.apache.xpath.internal.jaxp.XPathFacto
ryImpl' was found for 
http://java.sun.com/jaxp/xpath/dom

評価

0

わからない・・・

この処理、ループで回しています。1回目は成功するの
ですが、2回目でこけます。1回目と2回目のログを比較
すると、


JAXP: using thread context class loader 
(org.eclipse.core.runtime.internal.adaptor.Context
Finder@59c10b51) for search
JAXP: Looking up system property 
'javax.xml.xpath.XPathFactory:http://java.sun.com/
jaxp/xpath/dom'
JAXP: The property is undefined.
JAXP: found null in $java.home/jaxp.properties
JAXP: no META-
INF/services/javax.xml.xpath.XPathFactory file was 
found
JAXP: attempting to use the platform default W3C 
DOM XPath lib
JAXP: 
createInstance(com.sun.org.apache.xpath.internal.j
axp.XPathFactoryImpl)
JAXP: loaded 
com.sun.org.apache.xpath.internal.jaxp.XPathFactor
yImpl from 
jar:file:/C:/Program%20Files/Java/jre7/lib/rt.jar!
/com/sun/org/apache/xpath/internal/jaxp/XPathFacto
ryImpl.class
JAXP: factory 
'com.sun.org.apache.xpath.internal.jaxp.XPathFacto
ryImpl' was found for 
http://java.sun.com/jaxp/xpath/dom

//成功するときは、以下処理が走るのですが、2回目
は、ここでエラーが発生します。

JAXP: using thread context class loader 
(org.eclipse.core.runtime.internal.adaptor.Context
Finder@59c10b51) for search
JAXP: Looking up system property 
'javax.xml.xpath.XPathFactory:http://java.sun.com/
jaxp/xpath/dom'
JAXP: The property is undefined.
JAXP: found null in $java.home/jaxp.properties
JAXP: no META-
INF/services/javax.xml.xpath.XPathFactory file was 
found
JAXP: attempting to use the platform default W3C 
DOM XPath lib
JAXP: 
createInstance(com.sun.org.apache.xpath.internal.j
axp.XPathFactoryImpl)
JAXP: loaded 
com.sun.org.apache.xpath.internal.jaxp.XPathFactor
yImpl from 
jar:file:/C:/Program%20Files/Java/jre7/lib/rt.jar!
/com/sun/org/apache/xpath/internal/jaxp/XPathFacto
ryImpl.class
JAXP: factory 
'com.sun.org.apache.xpath.internal.jaxp.XPathFacto
ryImpl' was found for 
http://java.sun.com/jaxp/xpath/dom

評価

0

Exception in thread "AWT-EventQueue-0" 
javax.xml.parsers.FactoryConfigurationError: 
Factory class is the wrong type
    at 
javax.xml.parsers.DocumentBuilderFactory.newInstan
ce(DocumentBuilderFactory.java:115)

スレッドがEventQueueなのでGUIでボタン押下などのイベントが発生した場合の処理で例外が発生していると思うのですが、ループはそのままでいいのですが、処理内容を以下の1行のみとしたらどうなりますか?
特にXPathFactoryインスタンスの生成部分は必ず省いてください。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

またDocumentBuilderFactoryのソースを見ましたがnewInstanceの呼び出し上で
Factory class is the wrong type
というエラーメッセージは見あたりませんでした。
検索したところ古い実装では生成したオブジェクトをキャストする際にそのメッセージでFactoryConfigurationErrorを発生させるようです。
少なくともjava1.5以上ではClassCastExceptionがスローされるように変更されているようです。
またログの以下の部分を見ると
JAXP: using thread context class loader (org.eclipse.core.runtime.internal.adaptor.ContextFinder@59c10b51) for search
コンテキストクラスローダが何か設定されているようです。
私がEclipseでSwingアプリケーションのマウスイベント上でXPathFactory#newInstanceを呼び出してみたところ、ログは
JAXP: using thread context class loader (sun.misc.Launcher$AppClassLoader@ff057f) for search
となり、これは特にコンテキストクラスローダが設定されていないので通常使われるシステムクラスローダとなっています。
なので何かEclipseの設定がエラーの原因になっているような気がします。
そこで以下を確認してください。

プロジェクトを右クリックしてプロパティを開きJavaコンパイラーを選択してください。
コンパイラー準拠レベルは1.7でしょうか?

次にJavaのビルド・パスを選択してください。
JREシステムライブラリーは1.7でしょうか?
他に何かJarが追加されていますか?

実行/デバッグ設定でmainを含むクラスを選択して編集ボタンを押下してください。
JREタブの内容はどうでしょうか?
JRE7になっていますか?

また実行/デバッグ設定のクラスパスというタブを選びその内容を教えてください。
あと引数タブでVM引数は-Djaxp.debug=1のみでしょうか?

評価

0

いろいろアドバイスありがとうございます。
>処理内容を以下の1行のみとしたらどうなりますか?
エラー内容は、変わりませんでした。

>Factory class is the wrong type
>というエラーメッセージは見あたりませんでした。
確かに、ネットでソースコードを確認すると、見当たり
ませんが、デコンパイルすると以下コードがあります。
おそらく、ここで、エラーが発生していると思います。
/*     */   public static DocumentBuilderFactory 
newInstance()
/*     */   {
/*     */     try {
/* 110 */       return 
(DocumentBuilderFactory)ClassStuff.createFactory("
javax.xml.parsers.DocumentBuilderFactory", 
"gnu.xml.dom.JAXPFactory");
/*     */ 
/*     */     }
/*     */     catch (ClassCastException 
localClassCastException)
/*     */     {
/* 115 */       throw new 
FactoryConfigurationError(localClassCastException, 
"Factory class is the wrong type");
/*     */     }
/*     */   }
/*     */   

また、よくわからないのが、デコンパイルしたものを切
り出して、エラーが発生する前に、同じ処理を記載した
のですが、その同じ処理を記載したところではエラーが
発生せず、DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();でエラーが発
生します。

>プロジェクトを右クリックしてプロパティを開きJava
コンパイラーを選択してください。
>コンパイラー準拠レベルは1.7でしょうか?
1.7になっています。

>次にJavaのビルド・パスを選択してください。
>JREシステムライブラリーは1.7でしょうか?
>他に何かJarが追加されていますか?
JREシステムライブラリーは1.7しか設定していません。

>実行/デバッグ設定でmainを含むクラスを選択して編集
>ボタンを押下してください。
>JREタブの内容はどうでしょうか?
>JRE7になっていますか?
JRE7になっています。

引数内容は、以下のとおりです。
-Declipse.ignoreApp=true -Dosgi.noShutdown=true -
Djaxp.debug=1

評価

0

前回の回答で古い実装ではと言いましたが、
実行しているDocumentBuilderFactory#newInstanceは
GNU JAXPのライブラリーの実装のようです。
どこかに(<jre>/lib/extディレクトリなど)にgnujaxp.jarが配置されているか、
<jre>/lib/jaxp.propertiesにそのライブラリーが読み込まれるように
設定されていないか確認してみてください。
javax.xml.parsers.DocumentBuilderFactoryと名前は同じですが、
おそらくロードしたクラスローダが違うのでキャストに失敗しているのだと思います(gnujaxp.jarとrt.jarとクラスファイルも別ですし)。 
現在のGNU JAXPはJAXP1.3のライブラリーのようですが、
java1.7ではJAXPのバージョンは1.4になっているので、
特にそのライブラリーでなければならない理由がなければ、
gnujaxp.jarを読み込まないようにすればエラーが起きなくなると思います。

評価

0

PC内にあるgnujaxp.jarの名称を変えました。
jaxp.propertiesは見つからず。

System.getProperty("javax.xml.parsers.DocumentBuil
derFactory")で内容を確認すると、

nullの場合は、OK。2回目で、
com.sun.org.apache.xerces.internal.jaxp.DocumentBu
ilderFactoryImplに書き換えられ、エラーが発生してい
ます。


System.setProperty("javax.xml.parsers.DocumentBuil
derFactory", "null");を、DocumentBuilderFactory 
factory = 
DocumentBuilderFactory.newInstance();の前に記述し
ましたが、以下の違うエラーが発生するようになってし
まいました。

Exception in thread "AWT-EventQueue-0" 
javax.xml.parsers.FactoryConfigurationError: 
Factory class null not found
    at 
javax.xml.parsers.ClassStuff.createFactory(ClassSt
uff.java:141)


なぜ、途中で、システムプロパティが変わるのか、ま
た、jaxp.propertiesがないのかと、疑問は、あるので
すが、
なかなか解決できず。

評価

0

jaxp.propertiesはデフォルトではありません。
必要な場合に作成して設定するファイルです。
gnujaxp.jarはファイル名に関わらずクラスパス上にある場合、やコンテキストクラスローダー、エクステンションクラスローダ、ブートストラップクラスローダに設定されているパス上に存在すると読み込まれます。
なのでgnujaxp.jarを移動してみてください。
後学のために知りたいのですが、gnujaxp.jarが配置されていたのはどこでしょうか?
また
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
の直前に
System.out.println(DocumentBuilderFactory.class.getClassLoader());
を入れてみるとどうなりますか?
nullが出力される可能性もあります。

評価

0

gnujaxp.jarを移動しました。※エラーは発生し続けてい
ますが。。。
また、gnujaxp.jarは、jfreechartの中にあり、Dドライ
ブに自分で作成したフォルダに入れています。

System.out.println(DocumentBuilderFactory.class.get
ClassLoader());は、以下になります。
org.eclipse.osgi.internal.baseadaptor.DefaultClassL
oader@305e9a1b[MyJFreeChart:1.0.0(id=8)]

評価

0

>org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@305e9a1b[MyJFreeChart:1.0.0(id=8)]

[MyJFreeChart:1.0.0(id=8)]この部分はgnujaxp.jarを移動後にEclipseを再起動させて実行しても同じなのでしょうか?

GNU JAXPライブラリーのJarには
META-INF/services/javax.xml.parsers.DocumentBuilderFactoryファイル
が設定されているので前回テストして頂いた
System.out.println(DocumentBuilderFactory.class.getClassLoader());
の部分を
ClassLoader cl = DocumentBuilderFactory.class.getClassLoader();
if (cl != null) {
    try {
        java.util.Enumeration<java.net.URL> urls = cl.getResources(
            "META-INF/services/javax.xml.parsers.DocumentBuilderFactory");
        System.out.println("--------- path ---------");
        while (urls.hasMoreElements()) {
            System.out.println(urls.nextElement());
        }
    } catch (java.io.IOException e) {
        System.out.println(e);
    }
}
に置き換えて実行してみてください。
GNU JAXPのライブラリーのJarが表示されたら、それらすべてを移動させてください。

評価

0

すいません。また、再発するかもしれませんが、
プロジェクト設定で、不要と思われるPlug-inなどを削
除したり、必要なPlug-in等を追加していったら、動作
しました。

正常動作後の以下出力は、すべてnullになっています。
System.out.println(DocumentBuilderFactory.class.ge
tClassLoader());

また、前回の結果と異なるのですが、
System.getProperty("javax.xml.parsers.DocumentBuil
derFactory")の内容は、
com.sun.org.apache.xerces.internal.jaxp.DocumentBu
ilderFactoryImplで問題なく動作しています。

ClassLoaderが悪かったのか???

評価

30

getClassLoaderがnullを返すのはブートストラップクラスローダが使われている場合です。
ブートストラップクラスローダはJVMの一部でJavaのコアクラスをロードしますが、オブジェクトではないのでnullが返されます。
クラスローダのサブクラスを作成する場合に親にnullを指定した場合にもブートストラップクラスローダが親になります。

com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
はJava1.7デフォルトのDocumentBuilderFactoryのコンクリートクラスです。
ブートストラップクラスローダによってrt.jarからロードされます。
よって問題は解決したようですね。
私は環境変数のclasspathの設定が原因かと思ったのですが、EclipseのPlug-inでしたか。
Eclipseの設定に関して確認してもらった時に抜けてた部分があったようです。



評価

0

いろいろアドバイスありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。