Как я могу сказать jaxb / Maven для создания нескольких пакетов схем?
пример:
</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>
Что случилось: Maven выполняет первый плагин. Затем удаляет целевую папку и создает второй пакет, который затем отображается.
Я попытался установить target/somedir1 для первой конфигурации и target / somedir2 для второй конфигурации. Но поведение не меняется? Есть идеи? Я не хочу создавать пакеты непосредственно в папке src/main/java, потому что эти пакеты генерируются и не должны быть смешанный с ручными созданными классами.
9 ответов:
Я должен был указать разные
generateDirectory
(без этого плагин считал, что файлы были обновлены и ничего не генерировали во время второго выполнения). И я рекомендую следоватьtarget/generated-sources/<tool>
Соглашение для созданных источников, так что они будут импортированы в вашей любимой IDE автоматически. Я также рекомендую объявить несколькоexecution
вместо объявления плагина дважды (и для перемещенияconfiguration
внутри каждого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>
С этой настройкой я получаю следующий результат после
mvn clean compile
$ tree target/ target/ ├── classes │ ├── com │ │ └── stackoverflow │ │ ├── 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 │ └── stackoverflow │ └── package1 │ ├── ObjectFactory.java │ └── Shiporder.java └── xjc2 └── com └── stackoverflow └── package2 ├── BookForm.java ├── BooksForm.java ├── ObjectFactory.java └── package-info.javaчто, кажется, является ожидаемым результатом.
вы также можете использовать привязки JAXB для указания различных пакетов для каждой схемы, например
<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>
тогда просто используйте новый Maven-jaxb2-плагин 0.8.0
<schemas>
и<bindings>
элементовpom.xml
. Или укажите самый верхний каталог в<schemaDirectory>
и<bindingDirectory>
и<include>
схемы и привязки:<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>
Я думаю, что это более удобным решением, потому что при добавлении нового XSD вам не нужно менять Maven
pom.xml
, просто добавьте новый XJB привязка файла к тому же каталогу.
вы должны изменить это, чтобы определить плагин только один раз и не дважды территории исполнения...примерно следующий...и generateDirectory должен быть установлен (на основе документов)..
<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>
Это также может быть достигнуто путем указания устаревшего имени файла для схем и не очистки выходного каталога. Каталог out put по умолчанию автоматически включается в classpath, что мало удобно. Если указать другой каталог нужно позаботиться о classpath чтобы использовать этот код в IDE. Например -
<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>
Я решил с:
<removeOldOutput>false</removeOldOutput> <clearOutputDir>false</clearOutputDir> <forceRegenerate>true</forceRegenerate>
добавьте это в каждую конфигурацию ;)
следующие работы для меня, после многих проб
<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>
я столкнулся с большим количеством проблем при использовании jaxb в Maven, но мне удалось решить вашу проблему, выполнив следующие действия
сначала создайте схему.XJC file
<?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>
имя пакета может быть любым, каким вы хотите его видеть, если оно не содержит зарезервированных ключевых слов в Java
Далее вы должны создать wsimport.сценарий bat для создания вашего пакета и кода в предпочтительном месте.
cd C:\YOUR\PATH\TO\PLACE\THE\PACKAGES wsimport -keep -verbose -b "C:\YOUR\PATH\TO\schema.xjb" YOUR_URL?wsdl pause
Если вы не хотите используйте компакт-диск, вы можете поставить wsimport.летучая мышь в "C:\YOUR\PATH\TO\PLACE\THE\PACKAGES"
Если вы запустите его без-keep-verbose, он будет генерировать только пакеты, но не их .Java-файл.
the-b будет убедиться, что схема.xjc используется при создании
это исправлено в версии 1.6 плагин.
<groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>1.6</version>
быстрая заметка, хотя я заметил, что вывод первой итерации был удален. Я исправил это, добавив следующее К каждому из исполнений.
<removeOldOutput>false</removeOldOutput> <clearOutputDir>false</clearOutputDir>
вот мой полный рабочий пример с каждой итерацией правильно выводить. Кстати, мне пришлось сделать это из-за проблемы с дублированием пространства имен с xsd, которые мне дали. Это, кажется, решает мою проблему.
<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>
есть еще одно, четкое решение (ИМО) для этого Существует параметр под названием "staleFile" что используется в качестве флага, чтобы не создавать вещи. Просто измените его в каждом исполнении.