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.
Antworten:
Ich musste anders angeben
generateDirectory
(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, dietarget/generated-sources/<tool>
Konvention für generierte Quellen zu befolgen , damit diese automatisch in Ihre bevorzugte IDE importiert werden. Ich empfehle auch, mehrere zu deklarieren,execution
anstatt das Plugin zweimal zu deklarieren (und dasconfiguration
Innere jedesexecution
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 a das folgende Ergebnis
mvn clean compile
Welches scheint das erwartete Ergebnis zu sein.
quelle
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 benutze einfach das neue maven-jaxb2-Plugin 0.8.0
<schemas>
und<bindings>
Elemente in derpom.xml
. Oder geben Sie das oberste Verzeichnis in<schemaDirectory>
und<bindingDirectory>
und nach<include>
Ihren Schemas 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, dies ist eine bequemere Lösung , denn wenn Sie eine neue XSD hinzufügen, müssen Sie Maven nicht ändern
pom.xml
, sondern fügen einfach eine neue XJB-Bindungsdatei zum selben Verzeichnis hinzu.quelle
Sie sollten dies ändern, um das Plugin nur einmal zu definieren und zweimal Ausführungsbereiche auszuführen ... wie im Folgenden ... und das generateDirectory sollte festgelegt werden (basierend auf den Dokumenten).
<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, dass Sie gegen die Regel eines einzelnen Artefakts von Maven kämpfen ... Vielleicht sollten Sie darüber nachdenken.
quelle
Dies kann auch erreicht werden, indem ein veralteter Dateiname für Schemas angegeben und das Ausgabeverzeichnis nicht gelöscht wird. Das Standardausgabeverzeichnis wird automatisch in den Klassenpfad aufgenommen, was wenig praktisch ist. Wenn wir ein anderes Ausgabeverzeichnis angeben, muss man sich um den Klassenpfad kümmern, um diesen Code in der IDE zu verwenden. 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: Generieren von Code mit dem JAXB-Plugin
quelle
Ich habe gelöst mit:
<removeOldOutput>false</removeOldOutput> <clearOutputDir>false</clearOutputDir> <forceRegenerate>true</forceRegenerate>
füge dies jeder Konfiguration hinzu;)
quelle
<executions>
Tag hinzufügen . Das reicht aus.<removeOldOutput>
ist standardmäßig auf false gesetzt. Aber ich kann nicht<clearOutputDir>
bei static.highsource.org/mjiip/maven-jaxb2-plugin/…<clearOutputDir>false</clearOutputDir>
war genug für mich in meinem Fall.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 bemerkte, dass die erste Iterationsausgabe gelöscht wurde. Ich habe es behoben, indem ich jeder der Ausführungen Folgendes hinzugefügt habe.
<removeOldOutput>false</removeOldOutput> <clearOutputDir>false</clearOutputDir>
Hier ist mein vollständiges Arbeitsbeispiel, bei dem jede Iteration korrekt ausgegeben wird. Ü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>
quelle
Das Folgende funktioniert für mich nach langem Ausprobieren
<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>
quelle
Bei der Verwendung von jaxb in Maven sind viele Probleme aufgetreten, aber ich habe es geschafft, Ihr Problem folgendermaßen zu lösen
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 in Java keine reservierten Schlüsselwörter enthält
Als nächstes müssen Sie das Skript wsimport.bat erstellen, um Ihr Paket und Ihren Code am bevorzugten 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: \ IHR \ PFAD \ TO \ PLACE \ THE \ PACKAGES" einfügen.
Wenn Sie es ohne -keep -verbose ausführen, werden nur die Pakete generiert, nicht jedoch die Java-Dateien.
Das -b stellt sicher, dass beim Generieren die Datei schema.xjc verwendet wird
quelle
Es gibt eine andere, eindeutige (IMO) Lösung dafür. Es gibt einen Parameter namens "staleFile" , der als Flag verwendet, um keine Daten erneut zu generieren. Ändern Sie es einfach bei jeder Ausführung.
quelle