2

场景如下:我有一个 java 包 ( myapp.config ),其中包含我所有的 JAXB 注释类,我想从中生成一个 XML 模式文件。包中还有一个package-info.java文件,该文件包含包元素上的@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">

当我在详细调试模式下运行schemagen任务时,很明显该工具确实加载了所有.java文件,除了package-info.java,这就是它对命名空间一无所知的原因。

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

在此先感谢

4

1 回答 1

5

幸运的是我找到了解决方案,我将它发布给那些将来遇到同样问题的人:

它不起作用的原因是我以错误的方式调用了schemagen任务(如果没有像 schemagen 那样的文档或示例,这可能会发生)。而不是写:

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

您应该将路径的特定部分移动到包含元素中:

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

我仍然不确定为什么会这样,但是通过这种方式,schemagen 处理器识别myapp/config目录实际上指定了 java 包myapp.config并且知道它是一个包,它也会读取包信息文件。

于 2011-02-20T16:48:49.780 回答