schemagen ant task忽略package-info.java

buc*_*buc 2 ant jaxb jaxb2 schemagen

方案如下:我有一个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;
Run Code Online (Sandbox Code Playgroud)

当我运行JDK附带的schemagen命令行工具时,

D:\Projects\Myapp>"%JAVA_HOME%/bin/schemagen" -cp "%JAVA_HOME%/lib/tools.jar"
src/myapp/config/*.java
Run Code Online (Sandbox Code Playgroud)

我得到了正确的结果:生成的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" >
Run Code Online (Sandbox Code Playgroud)

但是,当我想在我的Ant脚本中执行相同的任务时,

<schemagen srcdir="src/myapp/config" destdir="dist">
    <include name="*.java"/>
</schemagen>
Run Code Online (Sandbox Code Playgroud)

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

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
Run Code Online (Sandbox Code Playgroud)

当我以详细调试模式运行schemagen任务时,很明显该工具会加载除package-info.java之外的所有.java文件,这就是为什么它不知道命名空间的原因.

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

提前谢谢,
buc

buc*_*buc 5

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

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

<schemagen srcdir="src/myapp/config" destdir="dist">
    <include name="*.java"/>
</schemagen>
Run Code Online (Sandbox Code Playgroud)

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

<schemagen srcdir="src" destdir="dist">
    <include name="myapp/config/*.java"/>
</schemagen>
Run Code Online (Sandbox Code Playgroud)

我真不知道为什么会这样,但这样一来,schemagen处理器识别出的myapp /配置其实目录中指定的Java包myapp.config并知道它是一个包,它也将阅读药品信息文件.