web-dev-qa-db-fra.com

Comment puis-je dire à jaxb/Maven de générer plusieurs packages de schéma?

Exemple:

</plugin>       
       <plugin>
           <groupId>org.jvnet.jaxb2.maven2</groupId>
           <artifactId>maven-jaxb2-plugin</artifactId>
           <version>0.7.1</version>
           <executions>
             <execution>
               <goals>
                 <goal>generate</goal>
               </goals>
             </execution>
           </executions>
            <configuration>
             <schemaDirectory>src/main/resources/dir1</schemaDirectory>
              <schemaIncludes>
                  <include>schema1.xsd</include>
              </schemaIncludes>
              <generatePackage>schema1.package</generatePackage>
           </configuration>
         </plugin>
          <plugin>
           <groupId>org.jvnet.jaxb2.maven2</groupId>
           <artifactId>maven-jaxb2-plugin</artifactId>
           <version>0.7.1</version>
           <executions>
             <execution>
               <goals>
                 <goal>generate</goal>
               </goals>
             </execution>
           </executions>
            <configuration>
             <schemaDirectory>src/main/resources/dir2</schemaDirectory>
              <schemaIncludes>
                  <include>schema2.xsd</include>
              </schemaIncludes>
              <generatePackage>schema2.package</generatePackage>
           </configuration>
         </plugin>
       </plugins>

Que s'est-il passé: Maven exécute le premier plugin. Supprime ensuite le dossier cible et crée le deuxième package, qui est ensuite visible.

J'ai essayé de définir cible/somedir1 pour la première configuration et cible/somedir2 pour la deuxième configuration. Mais le comportement ne change pas? Des idées? Je ne souhaite pas générer les packages directement dans le dossier src/main/Java, car ils sont générés et ne doivent pas être mélangés avec des classes créées manuellement.

63
M.R.

Je devais spécifier différents generateDirectory (sans cela, le plugin considérait que les fichiers étaient à jour et ne générait rien lors de la deuxième exécution). Et je recommande de suivre la convention target/generated-sources/<tool> pour les sources générées afin qu'elles soient importées automatiquement dans votre favori IDE. Je recommande également de déclarer plusieurs execution au lieu de déclarer le plugin deux fois (et de déplacer la configuration dans chaque élément execution):

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.7.1</version>
  <executions>
    <execution>
      <id>schema1-generate</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>src/main/resources/dir1</schemaDirectory>
        <schemaIncludes>
          <include>shiporder.xsd</include>
        </schemaIncludes>
        <generatePackage>com.stackoverflow.package1</generatePackage>
        <generateDirectory>${project.build.directory}/generated-sources/xjc1</generateDirectory>
      </configuration>
    </execution>
    <execution>
      <id>schema2-generate</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>src/main/resources/dir2</schemaDirectory>
        <schemaIncludes>
          <include>books.xsd</include>
        </schemaIncludes>
        <generatePackage>com.stackoverflow.package2</generatePackage>
        <generateDirectory>${project.build.directory}/generated-sources/xjc2</generateDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

Avec cette configuration, j’obtiens le résultat suivant après un mvn clean compile

 $ arbre cible /
 cible /
 ├── classes 
 ├── com 
 └── stackoverflow 
 Boîte de commande ObjectFactory.class 
 Une commande. Shiporder.class 
 Une commande. Shiporder $ Class.class 
 └── Shiporder $ Shipto.class 
__. │ └── paquet-info.class 
 Dir1 
. Shiporder.xsd 
 
 └── sources générées 
 ├── xjc 
 └── META-INF 
 └── └── Sun-jaxb.episode 
 ├── xjc1 
 └── com 
 Over └── stackoverflow 
 └── package1 
 ├── ObjectFactory.Java 
 Order └── Shiporder.Java 
 └── xjc2 
 └── com 
 └── stackoverflow 
 └── package2 
 ├── BookForm.Java 
 ├── BooksForm.Java 
 ├── ObjectFactory.Java 
 └── package-info.Java 

Ce qui semble être le résultat attendu.

95
Pascal Thivent

Vous pouvez également utiliser des liaisons JAXB pour spécifier un package différent pour chaque schéma, par exemple. 

<jaxb:bindings xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb" xmlns:xjc="http://Java.Sun.com/xml/ns/jaxb/xjc"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0" schemaLocation="book.xsd">

    <jaxb:globalBindings>
        <xjc:serializable uid="1" />
    </jaxb:globalBindings>

    <jaxb:schemaBindings>
        <jaxb:package name="com.stackoverflow.book" />
    </jaxb:schemaBindings>

</jaxb:bindings>

Ensuite, utilisez simplement les nouveaux éléments maven-jaxb2-plugin 0.8.0 <schemas> et <bindings> dans le pom.xml. Ou spécifiez le répertoire le plus haut dans <schemaDirectory> et <bindingDirectory> et par <include> vos schémas et liaisons:

<schemaDirectory>src/main/resources/xsd</schemaDirectory>
<schemaIncludes>
    <include>book/*.xsd</include>
    <include>person/*.xsd</include>
</schemaIncludes>
<bindingDirectory>src/main/resources</bindingDirectory>
<bindingIncludes>
    <include>book/*.xjb</include>
    <include>person/*.xjb</include>
</bindingIncludes>

Je pense que c'est une solution plus pratique , car lorsque vous ajoutez un nouveau XSD, vous n'avez pas besoin de changer Maven pom.xml, ajoutez simplement un nouveau fichier de liaison XJB au même répertoire.

12
xmedeko

vous devriez changer cela pour définir le plugin une seule fois et faire deux zones d'exécution ... comme suit ... et le generateDirectory devrait être défini (en fonction de la documentation) ..

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.7.1</version>
  <executions>
    <execution>
      <id>firstrun</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generateDirectory>target/gen1</generateDirectory>
        <schemaDirectory>src/main/resources/dir1</schemaDirectory>
        <schemaIncludes>
          <include>schema1.xsd</include>
        </schemaIncludes>
        <generatePackage>schema1.package</generatePackage>
      </configuration>
    </execution>
    <execution>
      <id>secondrun</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generateDirectory>target/gen2</generateDirectory>
        <schemaDirectory>src/main/resources/dir2</schemaDirectory>
        <schemaIncludes>
          <include>schema2.xsd</include>
        </schemaIncludes>
        <generatePackage>schema2.package</generatePackage>
      </configuration>
    </execution>
  </executions>
</plugin>

Il me semble que vous vous battez contre la règle d'un seul artefact de Maven ... vous devriez peut-être y penser.

6
khmarbaise

j'ai résolu avec:

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                        <forceRegenerate>true</forceRegenerate>

ajoutez ceci à chaque configuration;)

3
Davide Consonni

Pour ce faire, vous pouvez également spécifier un nom de fichier périmé pour les schémas et ne pas effacer le répertoire de sortie. Le répertoire par défaut est automatiquement inclus dans classpath, ce qui est peu pratique. Si nous spécifions un répertoire de sortie différent, il faut prendre en charge classpath pour utiliser ce code dans IDE. Par exemple -

<plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.3.1</version>
            <configuration>
                <quiet>true</quiet>
                <verbose>false</verbose>
                <clearOutputDir>false</clearOutputDir>
                <readOnly>true</readOnly>
                <arguments>-mark-generated</arguments>
            </configuration>
            <executions>
                <execution>
                    <id>reportingSchema</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <schemaDirectory>src/main/resources/schema/r17/schemaReporting</schemaDirectory>
                        <schemaIncludes>
                            <include>OCISchemaReporting.xsd</include>
                        </schemaIncludes>
                        <packageName>com.broadsoft.oci.r17.reporting</packageName>
                        <staleFile>${build.directory}/generated-sources/.jaxb-staleFlag-reporting</staleFile>
                    </configuration>
                </execution>
                <execution>
                    <id>schemaAS</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <schemaDirectory>src/main/resources/schema/r17/schemaAS</schemaDirectory>
                        <schemaIncludes>
                            <include>OCISchemaAS.xsd</include>
                        </schemaIncludes>
                        <packageName>com.broadsoft.oci.r17.as</packageName>
                        <staleFile>${build.directory}/generated-sources/.jaxb-staleFlag-as</staleFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
</plugins>

Source: Génération de code avec le plugin JAXB

3

J'ai rencontré beaucoup de problèmes lors de l'utilisation de jaxb dans Maven mais j'ai réussi à résoudre votre problème en procédant comme suit

Commencez par créer un fichier schema.xjc

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               jaxb:version="2.0">
    <jaxb:bindings schemaLocation="YOUR_URL?wsdl#types?schema1">
        <jaxb:schemaBindings>
            <jaxb:package name="your.package.name.schema1"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>
    <jaxb:bindings schemaLocation="YOUR_URL??wsdl#types?schema2">
        <jaxb:schemaBindings>
            <jaxb:package name="your.package.name.schema2"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>
</jaxb:bindings>

Le nom du paquet peut être ce que vous voulez, tant qu'il ne contient aucun mot-clé réservé en Java.

Ensuite, vous devez créer le script wsimport.bat pour générer votre package et votre code à l’emplacement préféré.

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

Si vous ne souhaitez pas utiliser cd, vous pouvez placer le fichier wsimport.bat dans "C:\YOUR\PATH\TO\PLACE\THE\PACKAGES".

Si vous l'exécutez sans -keep -verbose, il ne générera que les paquetages, mais pas les fichiers .Java.

Le -b s'assurera que le schéma.xjc est utilisé lors de la génération

2
Glenn Van Schil

Ce qui suit fonctionne pour moi, après beaucoup de procès

<plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>jaxb2-maven-plugin</artifactId>
         <version>2.1</version>
         <executions>
            <execution>
              <id>xjc1</id>
              <goals>
                  <goal>xjc</goal>
              </goals>
             <configuration>
                <packageName>com.mycompany.clientSummary</packageName>
               <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetClientSummary.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                 <clearOutputDir>false</clearOutputDir>
            </configuration>
          </execution>

          <execution>
             <id>xjc2</id>
             <goals>
                 <goal>xjc</goal>
             </goals>
             <configuration>
                <packageName>com.mycompany.wsclient.employerProfile</packageName>
                <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetEmployerProfile.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
         </configuration>
         </execution>

         <execution>
            <id>xjc3</id>
            <goals>
                <goal>xjc</goal>
            </goals>
            <configuration>
                <packageName>com.mycompany.wsclient.producersLicenseData</packageName>
                <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetProducersLicenseData.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
            </configuration>
        </execution>


     </executions>
  </plugin>
2
Brian teggart

Ceci est corrigé dans la version 1.6 du plugin .

            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>

Petite remarque cependant, j'ai remarqué que la première sortie était en cours de suppression. Je l'ai corrigé en ajoutant ce qui suit à chacune des exécutions.

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>

Voici mon exemple de travail complet avec chaque itération en sortie correctement. BTW je devais le faire en raison d'un problème d'espace de noms en double avec les xsd, on m'a donné. Cela semble résoudre mon problème.

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <id>submitOrderRequest</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <schemaDirectory>src/main/resources/xsd/</schemaDirectory>
                        <!-- <schemaFiles>getOrderStatusResponse.xsd,quoteShippingRequest.xsd,quoteShippingResponse.xsd,submitOrderRequest.xsd,submitOrderResponse.xsd</schemaFiles> -->
                        <schemaFiles>submitOrderRequest.xsd</schemaFiles>
                        <bindingDirectory>${project.basedir}/src/main/resources/xjb</bindingDirectory>
                        <bindingFiles>submitOrderRequest.xjb</bindingFiles>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                </execution>
                <execution>
                    <id>submitOrderResponse</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <schemaDirectory>src/main/resources/xsd/</schemaDirectory>
                        <!-- <schemaFiles>getOrderStatusResponse.xsd,quoteShippingRequest.xsd,quoteShippingResponse.xsd,submitOrderRequest.xsd,submitOrderResponse.xsd</schemaFiles> -->
                        <schemaFiles>submitOrderResponse.xsd</schemaFiles>
                        <bindingDirectory>${project.basedir}/src/main/resources/xjb</bindingDirectory>
                        <bindingFiles>submitOrderResponse.xjb</bindingFiles>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                </execution>
            </executions>

        </plugin>
1
Chris Hinshaw

Il existe une autre solution à ce problème, une solution claire (IMO) Il existe un paramètre appelé "staleFile" qui utilise comme indicateur pour ne pas générer de contenu à nouveau. Il suffit de le modifier à chaque exécution.

0
yevgeniy mordovkin