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
幸运的是我找到了解决方案,我将其发布给那些在未来遇到同样问题的人:
它不起作用的原因是我以错误的方式调用了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并知道它是一个包,它也将阅读药品信息文件.