2

シナリオは次のとおりです。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

4

1 に答える 1

5

幸いなことに、私は解決策を見つけました。将来同じ問題に遭遇した人のために投稿します。

それが機能しなかった理由は、schemagenタスクを間違った方法で呼び出したためです(これは、schemagenの場合のようにドキュメントや例が非常に少ない場合に発生する可能性があります)。書く代わりに:

<schemagen srcdir="src/myapp/config" destdir="dist">
    <include name="*.java"/>
</schemagen>

パスの特定の部分をinclude要素に移動する必要があります。

<schemagen srcdir="src" destdir="dist">
    <include name="myapp/config/*.java"/>
</schemagen>

なぜこれが起こっているのかはまだわかりませんが、このようにして、schemagenプロセッサは、myapp / configディレクトリが実際にjavaパッケージmyapp.configを指定していることを認識し、それがパッケージであることを認識することで、パッケージ情報も読み取ります。ファイル。

于 2011-02-20T16:48:49.780 に答える