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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top