wake-up-neo.com

Wie kann ich jaxb/Maven anweisen, mehrere Schemapakete zu generieren?

Beispiel:

</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>

Was ist passiert: Maven führt das erste Plugin aus. Löscht dann den Zielordner und erstellt das zweite Paket, das dann sichtbar ist.

Ich habe versucht, target/somedir1 für die erste Konfiguration und target/somedir2 für die zweite Konfiguration festzulegen. Aber das Verhalten ändert sich nicht? Irgendwelche Ideen? Ich möchte die Pakete nicht direkt im Ordner src/main/Java generieren, da diese Pakete generiert werden und nicht mit manuell erstellten Klassen gemischt werden sollten.

63
M.R.

Ich musste andere generateDirectory angeben (ohne dies berücksichtigte das Plugin, dass die Dateien auf dem neuesten Stand waren und während der zweiten Ausführung nichts generierten). Ich empfehle, die target/generated-sources/<tool>-Konvention für generierte Quellen zu befolgen, damit sie automatisch in Ihre bevorzugte IDE importiert werden. Ich empfehle auch, mehrere execution zu deklarieren, anstatt das Plugin zweimal zu deklarieren (und die configuration innerhalb jedes execution-Elements zu verschieben):

<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>

Mit diesem Setup erhalte ich nach einem mvn clean compile folgendes Ergebnis

 $ tree target /
 target /
 ├── Klassen 
 ├── ├── com 
 │ └── └── stackoverflow 
. ├── ├── App.class 
 1 │ │ paket1 
 │ ├── F ObjectFactory.class 
 │ │ │ order Shiporder.class 
 │ ├── order Shiporder $ Item.class 
 Order │ order └── $ $ ipt. Order __ order 2 ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├── ├──├── 
 └── └── └── package-info.class 
 ├── ├── dir1 
 └── └── └── shiporder.xsd 
. └── dir2 
.. Books.xsd 
 └── erzeugte Quellen 
 ├── xjc 
 └── └── META-INF 
 └── └── Sun-jaxb.episode 
 ├── xjc1 
 └── └── com 
 └── └── stackoverflow 
 └── └── Paket1 
 F ├── ObjectFactory.Java 
 └── └── Shiporder.Java 
 └── xjc2 
 └── com 
 └── stackoverflow 
 └── package2 
 ├── BookForm.Java 
 ├── BooksForm.Java 
 ├── ObjectFactory.Java 
 └── package-info.Java 

Welches scheint das erwartete Ergebnis zu sein.

95
Pascal Thivent

Sie können auch JAXB-Bindungen verwenden, um für jedes Schema ein anderes Paket anzugeben, z. 

<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>

Dann verwenden Sie einfach die neuen Elemente maven-jaxb2-plugin 0.8.0 <schemas> und <bindings> im pom.xml. Oder geben Sie das oberste Verzeichnis in <schemaDirectory> und <bindingDirectory> und mit <include> Ihren Schemata und Bindungen an:

<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>

Ich denke, das ist eine bequemere Lösung , weil, wenn Sie eine neue XSD hinzufügen, Sie Maven pom.xml nicht ändern müssen, fügen Sie einfach eine neue XJB-Bindungsdatei in dasselbe Verzeichnis ein.

12
xmedeko

sie sollten dies ändern, um das Plugin nur einmal zu definieren, und doppelte Ausführungsbereiche auszuführen ... wie im Folgenden ... und das generateDirectory sollte (basierend auf den Dokumenten) festgelegt werden.

<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>

Es schien mir, als würden Sie gegen eine einzelne Artefaktregel des Maven kämpfen. Vielleicht sollten Sie darüber nachdenken.

6
khmarbaise

ich habe gelöst mit:

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

füge dies zu jeder Konfiguration hinzu;)

3
Davide Consonni

Dies kann auch erreicht werden, indem der veraltete Dateiname für Schemas angegeben wird und das Ausgabeverzeichnis nicht gelöscht wird. Das Standardausgabeverzeichnis wird automatisch in classpath eingefügt, was wenig praktisch ist. Wenn wir ein anderes Ausgabeverzeichnis angeben, muss man auf classpath achten, um diesen Code in IDE verwenden zu können. Zum Beispiel -

<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>

Quelle: Code mit JAXB-Plugin generieren

Bei der Verwendung von Jaxb in Maven bin ich auf viele Probleme gestoßen, aber ich habe es geschafft, Ihr Problem zu lösen, indem Sie Folgendes tun

Erstellen Sie zuerst eine schema.xjc-Datei

<?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>

Der Paketname kann beliebig sein, solange er keine reservierten Schlüsselwörter in Java enthält

Als Nächstes müssen Sie das Skript "wsimport.bat" erstellen, um das Paket und den Code am gewünschten Speicherort zu generieren.

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

Wenn Sie keine CD verwenden möchten, können Sie die Datei "wsimport.bat" in "C:\YOUR\PATH\TO\PLACE\THE\PACKAGES" einfügen.

Wenn Sie es ohne -keep -verbose ausführen, werden nur die Pakete generiert, nicht jedoch die .Java-Dateien.

Die Option -b stellt sicher, dass die schema.xjc beim Generieren verwendet wird

2
Glenn Van Schil

Das folgende funktioniert für mich nach vielen Versuchen

<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

Dies ist in Version 1.6 des Plugins behoben .

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

Kurzer Hinweis: Ich habe festgestellt, dass die erste Iterationsausgabe gelöscht wurde. Ich habe es korrigiert, indem ich den Ausführungen jeweils Folgendes hinzugefügt habe.

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

Hier ist mein volles Arbeitsbeispiel mit jeder Iteration korrekt ausgegeben. Übrigens musste ich dies aufgrund eines doppelten Namespace-Problems mit den Xsds tun, die mir gegeben wurden. Dies scheint mein Problem zu lösen.

        <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

Es gibt eine andere, eindeutige (IMO) -Lösung für diese Es gibt einen Parameter namens "staleFile" , der als Flag verwendet, um nichts erneut zu generieren. Ändern Sie es einfach in jeder Ausführung.

0