Генерация классов с помощью jaxb2-maven-plugin из WSDL
У меня проблемы с настройкой jaxb2-maven-plugin
генерировать классы Java из WSDL и нескольких файлов XSD, которые существуют в одном и том же стандартном каталоге src/main/xsd
,
Как использовать плагин Jaxb2 Maven с встроенным XSD? связано только с тем, что ответы правильно предлагают использовать wsdl
параметр в конфигурации плагина, но этот вопрос действительно касается встроенных XSD, и мои XSD являются внешними.
Параметры цели плагина перечислены здесь.
Моя конфигурация плагина:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<packageName>com.x.y.model</packageName>
<wsdl>true</wsdl>
</configuration>
</plugin>
Я проверяю это с mvn -X clean jaxb2:xjc
но плагин игнорирует .wsdl
как видно из результатов отладки
[DEBUG] accept false for file c:\projects\foo\src\main\xsd\service.wsdl
[DEBUG] accept true for file c:\projects\foo\src\main\xsd\datatypes.xsd
[DEBUG] accept true for file c:\projects\foo\src\main\xsd\more-datatypes.xsd
7 ответов
Изучив выходные данные отладки Maven для аргументов, передаваемых в JAXB XJC (и немного проб и ошибок), я обнаружил, что мне нужно было предоставить еще 2 параметра конфигурации для плагина.
Это останавливает сканирование плагина для файлов XSD и просто использует .wsdl
как источник Файлы XSD включены в WSDL как<xsd:include schemaLocation="datatypes.xsd" />
директивы, например, которые разрешаются локально, в результате чего все типы из WSDL и XSD генерируются как классы Java.
Раздел конфигурации, который работал для меня:
<configuration>
<packageName>com.x.y.model</packageName>
<wsdl>true</wsdl>
<xmlschema>false</xmlschema>
<schemaFiles>service.wsdl</schemaFiles>
</configuration>
Без <xmlschema>false</xmlschema>
Maven ошибки с:
org.apache.maven.lifecycle.LifecycleExecutionException: не удалось выполнить цель org.codehaus.mojo:jaxb2-maven-plugin:1.5:xjc (default-cli) в проекте foo: не удалось обработать схему: /c:/projects/foo/src/main/xsd/service.wsdl
У меня был этот вопрос для jaxb2-maven-plugin 2.5.0. Вот мое решение:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.5.0</version>
<executions>
<execution>
<phase>generate-resources</phase>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<sourceType>wsdl</sourceType>
<sources>
<source>${project.basedir}/src/main/resources/wsdl</source>
</sources>
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<clearOutputDir>false</clearOutputDir>
<packageName>com.project.generated</packageName>
<noPackageLevelAnnotations>true</noPackageLevelAnnotations>
</configuration>
</plugin>
Если вы также генерируете wsdl и xsd, попробуйте ввести другую конфигурацию выполнения: она может не совпадать schemaDirectory
или плагин не будет успешно запущен при втором выполнении, потому что он кэширует выполнение на основе этой переменной. Я советую сделать это, например,
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>generate-sri-facturas</id>
<phase>generate-sources</phase>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/sri</outputDirectory>
<packageName>${commonsource.packageName}</packageName>
<schemaDirectory>src/main/resources/schema/xsd</schemaDirectory>
<schemaFiles>factura_v1.1.0.xsd</schemaFiles>
</configuration>
</execution>
<execution>
<id>generate-sri-autorizacion-comprobantes</id>
<phase>generate-sources</phase>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/sri/autorizacion</outputDirectory>
<packageName>${commonsource.packageName}.autorizacion</packageName>
<wsdl>true</wsdl>
<xmlschema>false</xmlschema>
<schemaDirectory>src/main/resources/schema/wsdl</schemaDirectory>
<schemaFiles>AutorizacionComprobantes.wsdl</schemaFiles>
</configuration>
</execution>
</executions>
</plugin>
Я создал xsd
и wsdl
папка для отдельных конфигураций.
Вы можете использовать следующий код в конфигурации:
<configuration>
<!-- Package to store the generated file -->
<packageName>com.example.demo.wsdl</packageName>
<!-- Treat the input as WSDL -->
<wsdl>true</wsdl>
<!-- Input is not XML schema -->
<xmlschema>false</xmlschema>
<!-- The WSDL file that you saved earlier -->
<schemaFiles>horarios.wsdl</schemaFiles>
<!-- The location of the WSDL file -->
<schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory>
<!-- The output directory to store the generated Java files -->
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<!-- Don't clear output directory on each run -->
<clearOutputDir>false</clearOutputDir>
</configuration>
Я пытался jaxb2-maven-plugin
которые генерируют файл Java
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>src/main/webapp/schemas/</schemaDirectory>
<wsdl>true</wsdl>
<outputDirectory>src/main/java</outputDirectory>
</configuration>
</plugin>
Для запуска я использовал команду
mvn jaxb2:xjc
Попробуйте это, он сгенерирует классы jaxb в вашу папку src. Надеюсь, вы ищете это.
Для версии 2.5 конфигурация будет следующей:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.5.0</version>
<executions>
<execution>
<id>xjc</id>
<phase>generate-sources</phase>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<packageName>com.packagename</packageName>
<sources>
<source>${project.basedir}/src/main/resources/wsdl</source>
</sources>
<sourceType>wsdl</sourceType>
<clearOutputDir>false</clearOutputDir>
<noPackageLevelAnnotations>true</noPackageLevelAnnotations>
</configuration>
</execution>
</executions>
</plugin>
- плагин com.sun.xml.ws:jaxws-maven-plugin:4.0.2 цель wsimport при создании клиента SOAP (пространство имен Jakarta)
- очень важная зависимость com.sun.xml.ws:jaxws-ri:4.0.2 типа pom