A tarefa ant do esquemagen ignora package-info.java
Pergunta
O cenário é o seguinte:Eu tenho um pacote java (meuapp.config) que contém todas as minhas classes anotadas em JAXB, das quais gostaria de gerar um arquivo de esquema XML.No pacote, há também um pacote-info.java arquivo, que contém o @XmlSchema anotação no elemento package, portanto válida em todo o pacote:
@XmlSchema(namespace="http://myapp/config",
xmlns = @XmlNs(prefix="myapp", namespaceURI="http://myapp/config"),
elementFormDefault=XmlNsForm.QUALIFIED)
package myapp.config;
Quando eu executo o esquema ferramenta de linha de comando que vem com o JDK,
D:\Projects\Myapp>"%JAVA_HOME%/bin/schemagen" -cp "%JAVA_HOME%/lib/tools.jar"
src/myapp/config/*.java
Eu obtenho o resultado correto:o elemento raiz no gerado esquema1.xsd arquivo contém o targetNamespace e outros atributos necessários:
<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" >
No entanto, quando desejo executar a mesma tarefa em meu script Ant,
<schemagen srcdir="src/myapp/config" destdir="dist">
<include name="*.java"/>
</schemagen>
A ferramenta schemagen parece ignorar completamente as anotações do namespace, porque no resultado esquema1.xsd arquivo, não há nenhum vestígio deles:
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
Quando eu executo o esquema tarefa em detalhado e depurar modo, torna-se óbvio que a ferramenta carrega todos os .Java arquivos, exceto pacote-info.java, é por isso que não sabe nada sobre os namespaces.
Você já conheceu esse comportamento estranho antes?Por que a ferramenta de linha de comando processa o arquivo de informações do pacote e a tarefa Ant não?O que devo fazer para que a tarefa Ant funcione?
Desde já, obrigado,
cara
Solução
Felizmente encontrei a solução, posto para quem tiver o mesmo problema no futuro:
A razão pela qual não funcionou é que liguei para o esquema tarefa de maneira errada (isso pode acontecer se houver tão pouca documentação ou exemplos como no caso do esquemagen).Em vez de escrever:
<schemagen srcdir="src/myapp/config" destdir="dist">
<include name="*.java"/>
</schemagen>
Você deve mover a parte específica do caminho para o incluir elemento:
<schemagen srcdir="src" destdir="dist">
<include name="myapp/config/*.java"/>
</schemagen>
Ainda não sei por que isso está acontecendo, mas desta forma o processador do esquema reconhece que o meuapp/config diretório de fato designa o pacote java meuapp.config e sabendo que se trata de um pacote, também lerá o arquivo de informações do pacote.