Como posso dizer ao jaxb / Maven para gerar vários pacotes de esquema?

Exemplo:

  org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.7.1    generate     src/main/resources/dir1  schema1.xsd  schema1.package    org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.7.1    generate     src/main/resources/dir2  schema2.xsd  schema2.package    

O que aconteceu: o Maven executa o primeiro plugin. Em seguida, exclui a pasta de destino e cria o segundo pacote, que fica visível.

Tentei definir target / somedir1 para a primeira configuração e target / somedir2 para a segunda configuração. Mas o comportamento não muda? Alguma ideia? Eu não quero gerar os pacotes diretamente na pasta src / main / java, porque esses pacotes são gerados e não devem ser misturados com classs criadas manualmente.

Eu tive que especificar generateDirectory diferente (sem isso, o plugin estava considerando que os arquivos estavam atualizados e não estava gerando nada durante a segunda execução). E eu recomendo seguir a convenção target/generated-sources/ para fonts geradas para que elas sejam importadas automaticamente em seu IDE favorito. Eu também recomendo declarar várias execution invés de declarar o plugin duas vezes (e mover a configuration dentro de cada elemento de execution ):

  org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.7.1   schema1-generate  generate   src/main/resources/dir1  shiporder.xsd  com.stackoverflow.package1 ${project.build.directory}/generated-sources/xjc1    schema2-generate  generate   src/main/resources/dir2  books.xsd  com.stackoverflow.package2 ${project.build.directory}/generated-sources/xjc2     

Com esta configuração, recebo o seguinte resultado depois de uma mvn clean compile

 alvo de tree $
 alvo/
 ├── aulas
 │ ├── com
 Stack │ └── stackoverflow
 App │ ├── App.class
 Package │ ├── package1
 Object │ │ ├── ObjectFactory.class
 Ship │ │ ├── Shiporder.class
 Ship │ │ ├── Shiporder $ Item.class
 Ship │ │ └── Shiporder $ Shipto.class
 Package │ └── package2
 Book │ ├── BookForm.class
 Books │ ├── BooksForm.class
 Object │ ├── ObjectFactory.class
 Package │ └── package-info.class
 Dir ├── dir1
 Ship │ └── shiporder.xsd
 Dir └── dir2
 Books └── books.xsd
 Generated── fonts geradas
     X── xjc
     ME └── META-INF
     Sun └── sun-jaxb.episode
     X── xjc1
     │ └── com
     Stack └── stackoverflow
     Package └── package1
     Object ├── ObjectFactory.java
     Ship └── Shiporder.java
     X── xjc2
         └── com
             Stack── stackoverflow
                 Package── package2
                     Book── BookForm.java
                     Books── BooksForm.java
                     Object── ObjectFactory.java
                     Package── package-info.java

Qual parece ser o resultado esperado.

Você também pode usar ligações JAXB para especificar um pacote diferente para cada esquema, por exemplo

         

Em seguida, use apenas os novos elementos maven-jaxb2-plugin 0.8.0 e no pom.xml . Ou especifique o diretório mais alto em e e por seus esquemas e ligações:

 src/main/resources/xsd  book/*.xsd person/*.xsd  src/main/resources  book/*.xjb person/*.xjb  

Eu acho que esta é a solução mais conveniente , porque quando você adicionar um novo XSD você não precisa mudar o Maven pom.xml , basta adicionar um novo arquivo de binding XJB ao mesmo diretório.

você deve alterar isso para definir o plugin apenas uma vez e executar duas áreas de execução … como a seguinte … e o generateDirectory deve ser configurado (baseado nos docs).

  org.jvnet.jaxb2.maven2 maven-jaxb2-plugin 0.7.1   firstrun  generate   target/gen1 src/main/resources/dir1  schema1.xsd  schema1.package    secondrun  generate   target/gen2 src/main/resources/dir2  schema2.xsd  schema2.package     

Pareceu-me que você está lutando contra a regra do artefato único do maven … pode ser que você deva pensar sobre isso.

Isso também pode ser obtido especificando o nome do arquivo obsoleto para esquemas e não limpando o diretório de saída. O diretório out put padrão é incluído automaticamente no caminho de class, o que é pouco conveniente. Se nós especificarmos um diretório de saída diferente, temos que cuidar do classpath para usar este código no IDE. Por exemplo –

   org.codehaus.mojo jaxb2-maven-plugin 1.3.1  true false false true -mark-generated    reportingSchema  xjc   src/main/resources/schema/r17/schemaReporting  OCISchemaReporting.xsd  com.broadsoft.oci.r17.reporting ${build.directory}/generated-sources/.jaxb-staleFlag-reporting    schemaAS  xjc   src/main/resources/schema/r17/schemaAS  OCISchemaAS.xsd  com.broadsoft.oci.r17.as ${build.directory}/generated-sources/.jaxb-staleFlag-as      

Fonte: Gerando Código com o Plugin JAXB

eu tenho resolvido com:

  false false true 

adicione isto a cada configuração;)

O seguinte funciona para mim, depois de muito ensaio

  org.codehaus.mojo jaxb2-maven-plugin 2.1   xjc1  xjc   com.mycompany.clientSummary wsdl  src/main/resources/wsdl/GetClientSummary.wsdl  target/generated-sources/xjb false    xjc2  xjc   com.mycompany.wsclient.employerProfile wsdl  src/main/resources/wsdl/GetEmployerProfile.wsdl  target/generated-sources/xjb false    xjc3  xjc   com.mycompany.wsclient.producersLicenseData wsdl  src/main/resources/wsdl/GetProducersLicenseData.wsdl  target/generated-sources/xjb false     

Eu encontrei um monte de problemas ao usar o jaxb no Maven, mas eu consegui resolver o seu problema, fazendo o seguinte

Primeiro crie um arquivo schema.xjc

              

O nome do pacote pode ser o que você quiser, contanto que não contenha nenhuma palavra-chave reservada em Java

Em seguida, você deve criar o script wsimport.bat para gerar seu pacote e código no local preferido.

 cd C:\YOUR\PATH\TO\PLACE\THE\PACKAGES wsimport -keep -verbose -b "C:\YOUR\PATH\TO\schema.xjb" YOUR_URL?wsdl pause 

Se você não quiser usar o cd, você pode colocar o wsimport.bat em “C: \ SEU CAMINHO \ PARA \ PLACE \ THE \ PACOTES”

Se você executá-lo sem -keep -verbose, ele apenas gerará os pacotes, mas não os arquivos .java.

O -b irá garantir que o schema.xjc seja usado ao gerar

Isso é corrigido na versão 1.6 do plugin .

  org.codehaus.mojo jaxb2-maven-plugin 1.6 

Nota rápida, notei que a primeira saída de iteração estava sendo deletada. Eu consertei adicionando o seguinte a cada uma das execuções.

  false false 

Aqui está o meu exemplo de trabalho completo com cada iteração saindo corretamente. BTW eu tive que fazer isso devido a um problema de namespace duplicado com o xsd que me foi dado. Isso parece resolver o meu problema.

   org.codehaus.mojo jaxb2-maven-plugin 1.6   submitOrderRequest  xjc   true src/main/resources/xsd/  submitOrderRequest.xsd ${project.basedir}/src/main/resources/xjb submitOrderRequest.xjb false false    submitOrderResponse  xjc   true src/main/resources/xsd/  submitOrderResponse.xsd ${project.basedir}/src/main/resources/xjb submitOrderResponse.xjb false false     

Existe outra, uma solução clara (IMO) para isso. Existe um parâmetro chamado “staleFile” que usa como sinalizador para não gerar material novamente. Basta alterá-lo em cada execução.