Генерация классов с помощью 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>
  1. плагин com.sun.xml.ws:jaxws-maven-plugin:4.0.2 цель wsimport при создании клиента SOAP (пространство имен Jakarta)
  2. очень важная зависимость com.sun.xml.ws:jaxws-ri:4.0.2 типа pom
Другие вопросы по тегам