[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10743] Re: More Java Pitfalls を 読む会第 2 回議事録



 井上泰です。

6/28読書会に出席できませんでした。
MJP(More Java Pitfalls)の動作検証結果を添付します。
動作検証したのは Item06 - Item10です。

----------------------
サンプルソース:
http://www.wiley.com/legacy/compbooks/daconta/mjp/sourcecode.html
環境: Windows 2000
JVM: SUN jdk1.4.1
IBM jdl1.3.1(WSADに添付されたruntime)
ant: ant 1.5.1
----------------------
実行結果の要約:

Item 06

jdk1.3.1+crimson1.1はMJPの記述どおりに動作した
jdk1.4.1 + ESOM でScheduleSwitcherを実行すると、
Document.getDocumentElement().toString()の実行時に、toString()がxml階層
を表示しない

Item 07

MJPの記述どおりに動作した

Item 08

MJPの記述どおりに動作した

Item 09

MJPのサンプルのとおりにxmlが出力されない(バージョンの違いか?)
org.javapitfalls.item9.JdomSaveを実行すると例外が発生する

Item 10

Winで動作させただけ。Macでは動作確認していない

-------------------
印象:
トピックが古いものがあり最新バージョンで検証/訂正されていないようです。
MJP自体がPitfalls(落とし穴)になるかもしれない。知識を深めるための手引き
になる。

以下はbuild.xmlです。参考になれば幸いです。
----------
Yasushi


Item 06
-------------------------------------------------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<project name="ESOM" default="run14esom" basedir=".">

<!--
More Java Pitfalls サンプルソースの入手
http://www.wiley.com/legacy/compbooks/daconta/mjp/sourcecode.html

ant の入手
http://ant.apache.org/bindownload.cgi

jdkの入手
http://java.sun.com/j2se/downloads.html
-->

<!--

MJP(More Java Pitfalls) Item 6: When Implementations of Standard APIs
Collide

DOM変更クラス
. basedir
│ schedule.xml スケジュール
│ build.xml このビルドファイル
│
├─src ソースファイル(${appl.src.path})
│ ScheduleSwitcher.java
│
├─bin クラスファイル(${appl.bin.path})
│ ScheduleSwitcher.class
│
└─lib jdk1.3実行用のJAXPファイル(${appl.lib.dir})
http://xml.apache.org/dist/crimson/Old/crimson-1.1.zip
jaxp.jar
crimson.jar

推奨規格標準オーバーライド機構(ESOM)のディレクトリとjarファイル($
{java.endorsed.dir})

c:/java/lib
└─endorsed
└─xerces-2_4_0
xercesImpl.jar
xercesSamples.jar
xml-apis.jar
xmlParserAPIs.jar

----------------------------------------------
実行時の不具合について:

jdk1.4.1 + ESOM でScheduleSwitcherを実行すると、
Document.getDocumentElement().toString()の実行時に、toString()がxml階層
を表示しない

原因
crimson-1.1の次のバージョンから、toString()表示が変更になった

解決策
1. DOM level3のDOMWriterで出力する(Item 9)
2. 以下のように、Xercesのorg.apache.xml.serializeパッケージを使用する

try {

// chaeck to see if org.apache.xml.serialize classes are available.
Class cls = Class.forName("org.apache.xml.serialize.XMLSerializer");
cls = Class.forName("org.apache.xml.serialize.XMLSerializer");

OutputFormat fmt = new OutputFormat();
fmt.setEncoding("Shift_JIS");
fmt.setIndenting(true);

XMLSerializer serializer = new XMLSerializer(System.out, fmt);
serializer.serialize(doc);

} catch (Exception e) {
System.out.println("Document was not printed; Could not find an
appropriate serializer.");
}

-->

<property name="appl.src.path" value="./src"/>
<property name="appl.bin.path" value="./bin"/>
<property name="appl.lib.dir" value="./lib"/>
<property name="java.endorsed.dir"
value="C:/java/lib/endorsed/xerces-2_4_0"/>
<property name="java.13.jvm"
value="C:/java/WebSphereStudio/runtimes/base_v5/java/bin/java.exe"/>

<path id="appl.class.path">
<pathelement location="${appl.bin.path}"/>
</path>

<!-- MJPのとおりに実行されるのは、crimson-1.1 のみ -->
<path id="appl.crimson.path">
<pathelement location="${appl.bin.path}"/>
<fileset dir="${appl.lib.dir}">
<include name="*.jar"/>
</fileset>
</path>

<target name="compile"
description="項目6のソースファイルをコンパイルする">
<javac srcdir="${appl.src.path}" destdir="${appl.bin.path}">
<classpath>
<pathelement location="${appl.src.path}"/>
</classpath>
</javac>
</target>

<target name="run14esom"
depends="compile"
description="jdk1.4(ESOM)を使用してScheduleSwitcherを実行する">

<echo message="------- JVMのバージョン -------"/>
<java classname=" " fork="true">
<classpath>
<path refid="appl.crimson.path" />
</classpath>
<jvmarg value="-version"/>
</java>

<echo message="------- DOMの解析 -------"/>
<java classname="ScheduleSwitcher" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
<jvmarg value="-Djava.endorsed.dirs=${java.endorsed.dir}"/>
<arg value="schedule.xml"/>
</java>

</target>

<target name="run13"
depends="compile"
description="jdk1.3.1(jaxp.jar,crimson.jar)を使用してScheduleSwitcherを
実行する">

<echo message="------- JVMのバージョン -------"/>
<java classname=" " fork="true" jvm="${java.13.jvm}">
<classpath>
<path refid="appl.crimson.path" />
</classpath>
<jvmarg value="-version"/>
</java>

<echo message="------- DOMの解析 -------"/>
<java classname="ScheduleSwitcher" fork="true" jvm="${java.13.jvm}">
<classpath>
<path refid="appl.crimson.path" />
</classpath>
<arg value="schedule.xml"/>
</java>

</target>

</project>

------------------------------------------------
Item 07
------------------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<project name="1.4Assertion" default="run" basedir=".">
<!--
More Java Pitfalls サンプルソースの入手
http://www.wiley.com/legacy/compbooks/daconta/mjp/sourcecode.html

ant の入手
http://ant.apache.org/bindownload.cgi

jdkの入手
http://java.sun.com/j2se/downloads.html
-->
<!--

MJP(More Java Pitfalls) Item 7: My Assertions Are Not Gratitous?

ディレクトリ構成
.
│ build.xml このビルドファイル
│
├─src ソースファイル(パッケージのサブディレクトリが存在する)
│ └─org
│ └─javapitfalls
│ └─item7
│ AnotherAssertionExample.java
│ AssertionExample.java
│
└─bin クラスファイル(パッケージのサブディレクトリが存在する)
└─org
└─javapitfalls
└─item7
AnotherAssertionExample.class
AssertionExample.class

-->

<property name="appl.src.path" value="./src"/>
<property name="appl.bin.path" value="./bin"/>

<path id="appl.class.path">
<pathelement location="${appl.bin.path}"/>
</path>

<target name="compile"
description="項目7のソースファイルをコンパイルする">
<javac srcdir="${appl.src.path}" destdir="${appl.bin.path}" source="1.4">
<classpath>
<pathelement location="${appl.src.path}"/>
</classpath>
</javac>
</target>

<target name="run"
depends="compile"
description="java AssertionExample (-eaなし)を実行する">
<java classname="org.javapitfalls.item7.AssertionExample" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
</java>
</target>

<target name="run_assertion"
depends="compile"
description="java -ea AssertionExample を実行する">
<java classname="org.javapitfalls.item7.AssertionExample" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
<jvmarg value="-ea"/>
</java>
</target>

<target name="run2"
depends="compile"
description="java AnotherAssertionExample (-eaなし)を実行する">
<java classname="org.javapitfalls.item7.AnotherAssertionExample"
fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
</java>
</target>

<target name="run2_assertion"
depends="compile"
description="java -ea AnotherAssertionExample を実行する">
<java classname="org.javapitfalls.item7.AnotherAssertionExample"
fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
<jvmarg value="-ea"/>
</java>
</target>

</project>

--------------------------------------
Item 08
--------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<project name="DOM" default="good" basedir=".">
<!--
More Java Pitfalls サンプルソースの入手
http://www.wiley.com/legacy/compbooks/daconta/mjp/sourcecode.html

ant の入手
http://ant.apache.org/bindownload.cgi

jdkの入手
http://java.sun.com/j2se/downloads.html
-->
<!--

MJP(More Java Pitfalls) Item 8: The Wrong Way to Search a DOM

Item 08 ディレクトリ
.
│ abml.dtd
│ myaddresses-ln.xml
│ myaddresses.xml
│ build.xml
│
├─src
│ └─org
│ └─javapitfalls
│ └─item8
│ BadDomLookup.java
│ DomViewer.java
│ GoodDomLookup.java
│ XpathLookup.java
│
└─bin
└─org
└─javapitfalls
└─item8
BadDomLookup.class
DomViewer$DomTreeModel.class
DomViewer$DomTreeCellRenderer.class
DomViewer$DomTreeCellEditor.class
DomViewer$1.class
DomViewer.class
DomUtil.class
GoodDomLookup.class
XpathLookup.class


org.dom4jのjarファイル(${org.dom4j.dir})
http://prdownloads.sourceforge.net/dom4j/dom4j-1.4.zip?download

c:/java/lib
└─dom4j-1.4
dom4j-full.jar
dom4j.jar

-->

<property name="appl.src.path" value="./src"/>
<property name="appl.bin.path" value="./bin"/>
<property name="java.lib.dir" value="C:/java/lib"/>
<property name="org.dom4j.dir" value="${java.lib.dir}/dom4j-1.4"/>
<property name="xml.file.name" value="myaddresses.xml"/>

<path id="appl.class.path">
<pathelement location="${appl.bin.path}"/>
<fileset dir="${org.dom4j.dir}" casesensitive="yes">
<include name="*.jar"/>
</fileset>
</path>

<target name="compile"
description="項目6のソースファイルをコンパイルする">
<javac srcdir="${appl.src.path}" destdir="${appl.bin.path}">
<classpath>
<path refid="appl.class.path" />
</classpath>
</javac>
</target>

<target name="good"
depends="compile"
description="org.javapitfalls.item8.GoodDomLookupを実行する">
<java classname="org.javapitfalls.item8.GoodDomLookup" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
<arg value="${xml.file.name}"/>
</java>
</target>

<target name="bad"
depends="compile"
description="org.javapitfalls.item8.BadDomLookupを実行する">
<java classname="org.javapitfalls.item8.BadDomLookup" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
<arg value="${xml.file.name}"/>
</java>
</target>

<target name="xpath"
depends="compile"
description="org.javapitfalls.item8.XpathLookupを実行する">
<java classname="org.javapitfalls.item8.XpathLookup" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
<arg value="${xml.file.name}"/>
</java>
</target>

<target name="viewer"
depends="compile"
description="org.javapitfalls.item8.DomViewerを実行する">
<java classname="org.javapitfalls.item8.DomViewer" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
<arg value="${xml.file.name}"/>
</java>
</target>

</project>
----------------------------------
Item 09
----------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<project name="SavingDOM" default="jaxpSave" basedir=".">
<!--
More Java Pitfalls サンプルソースの入手
http://www.wiley.com/legacy/compbooks/daconta/mjp/sourcecode.html

ant の入手
http://ant.apache.org/bindownload.cgi

jdkの入手
http://java.sun.com/j2se/downloads.html
-->
<!--

MJP(More Java Pitfalls) Item 9: The Saving-a-DOM Dilemma

ディレクトリ
.
│ abml.dtd
│ myaddresses-edited.xml
│ myaddresses-jaxp-save.xml
│ myaddresses-jdom-save.xml
│ myaddresses-xerces-save.xml
│ myaddresses.xml
│ build.xml
│
├─bin
│ └─org
│ └─javapitfalls
│ └─item9
│ DomEditor$1.class
│ DomEditor$DomTreeCellEditor.class
│ DomEditor$DomTreeCellRenderer.class
│ DomEditor$DomTreeModel.class
│ DomEditor.class
│ DomUtil.class
│ JaxpSave.class
│ JdomSave.class
│ XercesSave.class
│
└─src
└─org
└─javapitfalls
└─item9
DomEditor.java
DomUtil.java
JaxpSave.java
JdomSave.java
XercesSave.java

org.jdomのjarファイル(${org.jdom.dir})
http://www.jdom.org/dist/binary/jdom-b9.zip

c:/java/lib
└─jdom-b9
└─build
jdom.jar

org.apache.xercesのjarファイル(${apache.xerces.dir})
http://xml.apache.org/dist/xerces-j/old_xerces2/Xerces-J-bin.2.0.1.zip

c:/java/lib
└─endorsed
└─xerces-2_0_1
xercesSamples.jar
xercesImpl.jar
xmlParserAPIs.jar

----------------------------------------------
実行時の不具合について:

org.javapitfalls.item9.JdomSaveを実行すると、
このファイルの末尾に添付した例外が発生する

原因
調査中

回避策
myaddresses.xmlのSTSTEM-IDを以下のように変更した
オリジナル:
<!DOCTYPE ADDRESS_BOOK SYSTEM "abml.dtd">

修正後:
<!DOCTYPE ADDRESS_BOOK SYSTEM
"file:c:/Documents/java/wiley/pitfalls/item09/abml.dtd">

-->

<property name="appl.src.path" value="./src"/>
<property name="appl.bin.path" value="./bin"/>

<property name="java.lib.dir" value="C:/java/lib"/>
<property name="org.jdom.dir" value="${java.lib.dir}/jdom-b9"/>
<property name="apache.xerces.dir"
value="${java.lib.dir}/endorsed/xerces-2_0_1"/>

<property name="xml.file.name" value="myaddresses"/>

<path id="appl.jdom.path">
<fileset dir="${org.jdom.dir}" casesensitive="yes">
<include name="build/jdom.jar"/>
</fileset>
</path>

<path id="appl.xerces.path">
<fileset dir="${apache.xerces.dir}" casesensitive="yes">
<include name="*.jar"/>
<exclude name="xercesSamples.jar" />
</fileset>
</path>

<path id="appl.class.path">
<pathelement location="${appl.bin.path}"/>
</path>

<target name="compile"
description="項目9のソースファイルをコンパイルする">
<javac srcdir="${appl.src.path}" destdir="${appl.bin.path}">
<classpath>
<path refid="appl.class.path" />
<path refid="appl.jdom.path"/>
<path refid="appl.xerces.path"/>
</classpath>
</javac>
</target>

<target name="jaxpSave"
depends="compile"
description="org.javapitfalls.item9.JaxpSaveを実行する">
<java classname="org.javapitfalls.item9.JaxpSave" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
<arg value="${xml.file.name}.xml"/>
<arg value="${xml.file.name}_001_jaxp_save.xml"/>
</java>
</target>

<target name="xercesSave"
depends="compile"
description="org.javapitfalls.item9.XercesSaveを実行する">
<java classname="org.javapitfalls.item9.XercesSave" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
<jvmarg value="-Djava.endorsed.dirs=${apache.xerces.dir}"/>
<arg value="${xml.file.name}.xml"/>
<arg value="${xml.file.name}_001_xerces_save.xml"/>
</java>
</target>

<target name="jdomSave"
depends="compile"
description="org.javapitfalls.item9.JdomSaveを実行する">
<java classname="org.javapitfalls.item9.JdomSave" fork="true">
<classpath>
<path refid="appl.class.path" />
<path refid="appl.jdom.path"/>
</classpath>
<!-- <jvmarg value="-Djava.endorsed.dirs=${apache.xerces.dir}"/> -->
<arg value="${xml.file.name}.xml"/>
<arg value="${xml.file.name}_001_jdom_save.xml"/>
</java>
</target>

<target name="edit"
depends="compile"
description="org.javapitfalls.item9.DomEditorを実行する">
<java classname="org.javapitfalls.item9.DomEditor" fork="true">
<classpath>
<path refid="appl.class.path" />
<path refid="appl.jdom.path"/>
</classpath>
<!-- <jvmarg value="-Djava.endorsed.dirs=${apache.xerces.dir}"/> -->
<arg value="${xml.file.name}.xml"/>
</java>
</target>

</project>

<!--

C:\Documents\java\wiley\pitfalls\item09>ant jdomSave

uildfile: build.xml

compile:

jdomSave:
[java] org.jdom.JDOMException: Error in building from stream: 基本 URI
を使用せずに、相対 URI "abml.dtd" を解決することはできません。: 基本 URI
を使用せずに、相対 URI "abml.dtd" を解決することはできません。
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:265)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:287)
[java] at org.javapitfalls.item9.JdomSave.main(Unknown Source)
[java] Caused by: org.jdom.JDOMException: 基本 URI を使用せずに、相対
URI "abml.dtd" を解決することはできません。: 基本 URI を使用せずに、相対
URI "abml.dtd" を解決することはできません。
[java] at
org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:149)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:222)
[java] ... 2 more
[java] Caused by: org.xml.sax.SAXParseException: 基本 URI を使用せずに、
相対 URI "abml.dtd" を解決することはできません。
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3182)
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3176)
[java] at org.apache.crimson.parser.Parser2.resolveURI(Parser2.java:2758)
[java] at
org.apache.crimson.parser.Parser2.maybeExternalID(Parser2.java:2730)
[java] at
org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1129)
[java] at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:489)
[java] at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
[java] at
org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)
[java] at
org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
[java] at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:76)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:324)
[java] at
org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:140)
[java] ... 3 more
[java] Caused by: org.jdom.JDOMException: 基本 URI を使用せずに、相対
URI "abml.dtd" を解決することはできません。: 基本 URI を使用せずに、相対
URI "abml.dtd" を解決することはできません。
[java] at
org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:149)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:222)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:287)
[java] at org.javapitfalls.item9.JdomSave.main(Unknown Source)
[java] Caused by: org.xml.sax.SAXParseException: 基本 URI を使用せずに、
相対 URI "abml.dtd" を解決することはできません。
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3182)
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3176)
[java] at org.apache.crimson.parser.Parser2.resolveURI(Parser2.java:2758)
[java] at
org.apache.crimson.parser.Parser2.maybeExternalID(Parser2.java:2730)
[java] at
org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1129)
[java] at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:489)
[java] at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
[java] at
org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)
[java] at
org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
[java] at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:76)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:324)
[java] at
org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:140)
[java] ... 3 more
[java] Caused by: org.xml.sax.SAXParseException: 基本 URI を使用せずに、
相対 URI "abml.dtd" を解決することはできません。
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3182)
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3176)
[java] at org.apache.crimson.parser.Parser2.resolveURI(Parser2.java:2758)
[java] at
org.apache.crimson.parser.Parser2.maybeExternalID(Parser2.java:2730)
[java] at
org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1129)
[java] at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:489)
[java] at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
[java] at
org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)
[java] at
org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
[java] at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:76)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:324)
[java] at
org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:140)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:222)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:287)
[java] at org.javapitfalls.item9.JdomSave.main(Unknown Source)
[java] Caused by: org.jdom.JDOMException: 基本 URI を使用せずに、相対
URI "abml.dtd" を解決することはできません。: 基本 URI を使用せずに、相対
URI "abml.dtd" を解決することはできません。
[java] at
org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:149)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:222)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:287)
[java] at org.javapitfalls.item9.JdomSave.main(Unknown Source)
[java] Caused by: org.xml.sax.SAXParseException: 基本 URI を使用せずに、
相対 URI "abml.dtd" を解決することはできません。
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3182)
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3176)
[java] at org.apache.crimson.parser.Parser2.resolveURI(Parser2.java:2758)
[java] at
org.apache.crimson.parser.Parser2.maybeExternalID(Parser2.java:2730)
[java] at
org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1129)
[java] at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:489)
[java] at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
[java] at
org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)
[java] at
org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
[java] at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:76)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:324)
[java] at
org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:140)
[java] ... 3 more
[java] Caused by: org.xml.sax.SAXParseException: 基本 URI を使用せずに、
相対 URI "abml.dtd" を解決することはできません。
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3182)
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3176)
[java] at org.apache.crimson.parser.Parser2.resolveURI(Parser2.java:2758)
[java] at
org.apache.crimson.parser.Parser2.maybeExternalID(Parser2.java:2730)
[java] at
org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1129)
[java] at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:489)
[java] at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
[java] at
org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)
[java] at
org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
[java] at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:76)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:324)
[java] at
org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:140)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:222)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:287)
[java] at org.javapitfalls.item9.JdomSave.main(Unknown Source)
[java] Caused by: org.xml.sax.SAXParseException: 基本 URI を使用せずに、
相対 URI "abml.dtd" を解決することはできません。
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3182)
[java] at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3176)
[java] at org.apache.crimson.parser.Parser2.resolveURI(Parser2.java:2758)
[java] at
org.apache.crimson.parser.Parser2.maybeExternalID(Parser2.java:2730)
[java] at
org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1129)
[java] at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:489)
[java] at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
[java] at
org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)
[java] at
org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
[java] at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:76)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[java] at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[java] at java.lang.reflect.Method.invoke(Method.java:324)
[java] at
org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:140)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:222)
[java] at org.jdom.input.DOMBuilder.build(DOMBuilder.java:287)
[java] at org.javapitfalls.item9.JdomSave.main(Unknown Source)

BUILD SUCCESSFUL
Total time: 2 seconds

C:\Documents\java\wiley\pitfalls\item09>

-->
--------------------------------
Item 10
--------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<project name="Mouse" default="bad" basedir=".">
<!--
More Java Pitfalls サンプルソースの入手
http://www.wiley.com/legacy/compbooks/daconta/mjp/sourcecode.html

ant の入手
http://ant.apache.org/bindownload.cgi

jdkの入手
http://java.sun.com/j2se/downloads.html
-->
<!--

MJP(More Java Pitfalls) Item 10: Mouse Button Portability

ディレクトリ
.
│ build.xml
│
├─src
│ BadRightMouseButton.java
│ GoodRightMouseButton.java
│ MouseButtonExplorer.java
│
└─bin
BadRightMouseButton$1.class
BadRightMouseButton.class
GoodRightMouseButton$1.class
GoodRightMouseButton.class
MouseButtonExplorer$1.class
MouseButtonExplorer.class

-->

<property name="appl.src.path" value="./src"/>
<property name="appl.bin.path" value="./bin"/>

<path id="appl.class.path">
<pathelement location="${appl.bin.path}"/>
</path>

<target name="compile"
description="項目10のソースファイルをコンパイルする">
<javac srcdir="${appl.src.path}" destdir="${appl.bin.path}">
<classpath>
<path refid="appl.src.path" />
</classpath>
</javac>
</target>

<target name="bad"
depends="compile"
description="BadRightMouseButtonを実行する">
<java classname="BadRightMouseButton" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
</java>
</target>

<target name="good"
depends="compile"
description="GoodRightMouseButtonを実行する">
<java classname="GoodRightMouseButton" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
</java>
</target>

<target name="explorer"
depends="compile"
description="MouseButtonExplorerを実行する">
<java classname="MouseButtonExplorer" fork="true">
<classpath>
<path refid="appl.class.path" />
</classpath>
</java>
</target>

</project>