方案如下:我有一个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
答案 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 并且通过知道它是一个包,它还将读取包信息文件。