tutorial proyecto mvn español ejecutar desde crear consola compile como comandos maven-2 jaxb schema xsd java

maven 2 - proyecto - ¿Cómo puedo decirle a jaxb/Maven que genere múltiples paquetes de esquema?



mvn compile command (9)

Ejemplo:

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

Qué pasó: Maven ejecuta el primer complemento. A continuación, elimina la carpeta de destino y crea el segundo paquete, que luego es visible.

Intenté establecer target / somedir1 para la primera configuración y target / somedir2 para la segunda configuración. Pero el comportamiento no cambia? ¿Algunas ideas? No quiero generar los paquetes directamente en la carpeta src / main / java, ya que estos paquetes están generados y no deben mezclarse con clases creadas manualmente.


Encontré muchos problemas al usar jaxb en Maven, pero logré resolver tu problema haciendo lo siguiente

Primero crea un archivo 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>

El nombre del paquete puede ser cualquier cosa que desee, siempre que no contenga palabras clave reservadas en Java

A continuación, debe crear el script wsimport.bat para generar su paquete y código en la ubicación preferida.

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

Si no desea usar cd, puede poner wsimport.bat en "C: / YOUR / PATH / TO / PLACE / THE / PACKAGES"

Si lo ejecuta sin -keep -verbose, solo generará los paquetes pero no los archivos .java.

El -b se asegurará de que schema.xjc se use al generar


Esto también se puede lograr especificando el nombre del archivo obsoleto para los esquemas y no borrando el directorio de salida. El directorio predeterminado de salida se incluye automáticamente en classpath, que es poco conveniente. Si especificamos un directorio de salida diferente, tenemos que encargarnos de classpath para usar este código en IDE. Por ejemplo -

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

Fuente: generando código con el complemento JAXB


Hay otra, una solución clara (IMO) para esto. Hay un parámetro llamado "staleFile" que usa como indicador para no generar cosas de nuevo. Simplemente alternarlo en cada ejecución.


Lo siguiente funciona para mí, después de mucha prueba

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


También puede usar enlaces JAXB para especificar paquetes diferentes para cada esquema, por ejemplo

<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..book" /> </jaxb:schemaBindings> </jaxb:bindings>

A continuación, utilice los nuevos elementos maven-jaxb2-plugin 0.8.0 <schemas> y <bindings> en pom.xml . O especifique el directorio más alto en <schemaDirectory> y <bindingDirectory> y por <include> sus esquemas y enlaces:

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

Creo que esta es una solución más conveniente , porque cuando agrega un nuevo XSD no necesita cambiar Maven pom.xml , simplemente agregue un nuevo archivo de enlace XJB al mismo directorio.


Tuve que especificar diferente generateDirectory (sin esto, el plugin consideraba que los archivos estaban actualizados y no generaba nada durante la segunda ejecución). Y recomiendo seguir la convención target/generated-sources/<tool> para las fuentes generadas para que se importen automáticamente en su IDE favorito. También recomiendo declarar varias execution lugar de declarar el complemento dos veces (y mover la configuration dentro de cada elemento de 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..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..package2</generatePackage> <generateDirectory>${project.build.directory}/generated-sources/xjc2</generateDirectory> </configuration> </execution> </executions> </plugin>

Con esta configuración, obtengo el siguiente resultado después de una mvn clean compile

$ tree target/ target/ ├── classes │   ├── com │   │   └── │   │   ├── App.class │   │   ├── package1 │   │   │   ├── ObjectFactory.class │   │   │   ├── Shiporder.class │   │   │   ├── Shiporder$Item.class │   │   │   └── Shiporder$Shipto.class │   │   └── package2 │   │   ├── BookForm.class │   │   ├── BooksForm.class │   │   ├── ObjectFactory.class │   │   └── package-info.class │   ├── dir1 │   │   └── shiporder.xsd │   └── dir2 │   └── books.xsd └── generated-sources ├── xjc │   └── META-INF │   └── sun-jaxb.episode ├── xjc1 │   └── com │   └── │   └── package1 │   ├── ObjectFactory.java │   └── Shiporder.java └── xjc2 └── com └── └── package2 ├── BookForm.java ├── BooksForm.java ├── ObjectFactory.java └── package-info.java

Lo cual parece ser el resultado esperado.


deberías cambiar eso para definir el complemento una sola vez y hacer dos veces las áreas de ejecución ... como la siguiente ... y se debe establecer el directorio de generación (basado en los documentos).

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

Me parece que estás luchando contra la regla del artefacto único de maven ... puede ser que deberías pensar en esto.


lo he resuelto con:

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

agregar esto a cada configuración;)


Esto se soluciona en la versión 1.6 del complemento .

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

Sin embargo, noté rápidamente que la primera salida de iteración estaba siendo eliminada. Lo arreglé agregando lo siguiente a cada una de las ejecuciones.

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

Aquí está mi ejemplo de trabajo completo con cada iteración dando salida correctamente. Por cierto, tuve que hacer esto debido a un problema de espacio de nombres duplicado con los xsd que me dieron. Esto parece resolver mi problema.

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