schemagen ant task忽略package-info.java

时间:2011-02-20 16:14:44

标签: ant jaxb jaxb2 schemagen

方案如下:我有一个java包( myapp.config ),它包含我所有的JAXB注释类,我想从中生成一个XML模式文件。在包中,还有一个 package-info.java 文件,它包含package元素上的 @XmlSchema 注释,因此在整个包中都有效:

@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>

schemagen工具似乎完全忽略了命名空间注释,因为在生成的 schema1.xsd 文件中,没有它们的痕迹:

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

当我在 verbose debug 模式下运行 schemagen 任务时,很明显该工具会加载所有。 java 文件,除了 package-info.java ,这就是为什么它对命名空间一无所知。

你以前遇到过这种奇怪的行为吗?为什么命令行工具处理包信息文件,而Ant任务不处理?我该怎么做才能使Ant任务有效?

提前致谢,
BUC

1 个答案:

答案 0 :(得分: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 并且通过知道它是一个包,它还将读取包信息文件。