シナリオは次のとおりです。XML スキーマ ファイルを生成したいすべての JAXB アノテーション付きクラスを含むJava パッケージ ( myapp.config ) があります。パッケージには、パッケージ要素に@XmlSchema注釈を含むpackage-info.javaファイルもあり、パッケージ全体で有効です。
@XmlSchema(namespace="http://myapp/config",
xmlns = @XmlNs(prefix="myapp", namespaceURI="http://myapp/config"),
elementFormDefault=XmlNsForm.QUALIFIED)
package myapp.config;
JDK に付属のschemagenコマンドライン ツールを実行すると、
D:\Projects\Myapp>"%JAVA_HOME%/bin/schemagen" -cp "%JAVA_HOME%/lib/tools.jar"
src/myapp/config/*.java
正しい結果が得られます。生成されたschema1.xsdファイルのルート要素には、targetNamespaceとその他の必要な属性が含まれています。
<xs:schema elementFormDefault="qualified" version="1.0"
targetNamespace="http://myapp/config"
xmlns:tns="http://myapp/config"
xmlns:myapp="http://myapp/config">
xmlns:xs="http://www.w3.org/2001/XMLSchema" >
ただし、Ant スクリプト内で同じタスクを実行したい場合は、
<schemagen srcdir="src/myapp/config" destdir="dist">
<include name="*.java"/>
</schemagen>
結果のschema1.xsdファイルには名前空間の痕跡がないため、schemagen ツールは名前空間の注釈を完全に無視しているようです。
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
詳細モードとデバッグモードでschemagenタスクを実行すると、ツールがpackage-info.javaを除くすべての.javaファイルをロードすることが明らかになりました。そのため、名前空間について何も認識していません。
以前にこの奇妙な行動に遭遇したことがありますか? コマンドライン ツールはパッケージ情報ファイルを処理し、Ant タスクは処理しないのはなぜですか? Ant タスクを機能させるにはどうすればよいですか?
前もって感謝します、
buc