Плагин jaxb2 Maven не может генерировать пакеты Java с правильным импортом или выдает ошибки

В настоящее время я использую плагин Maven jaxb2 для создания POJO из моих XSD. У меня пока есть несколько проблем.

У меня есть 1 родительский XSD, который импортирует другой XSD, который, в свою очередь, импортирует 2 других XSD. a.xsd -> b.xsd -> (c.xsd & d.xsd) В моей конфигурации файла POM для плагина я включаю только самый верхний родительский XSD (a.xsd).

Проблема

Два импортированных XSD имеют элементы с одинаковыми именами, поэтому изначально, когда я запускал плагин, я получил сообщение об ошибке:

Класс/интерфейс с таким же именем {class/interface} уже используется. Используйте настройку класса, чтобы разрешить этот конфликт.

После долгих поисков в Google и заливки StackOverflow я наткнулся на решение использовать пользовательский файл привязки для обработки переименования классов/элементов-нарушителей.

привязки.xjb
<jaxb:bindings xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
               xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
               xmlns:jaxb = "http://java.sun.com/xml/ns/jaxb"
               xsi:schemaLocation = "http://java.sun.com/xml/ns/jaxb" version = "2.0">

    <jaxb:bindings schemaLocation = "./sets.xsd">
        <jaxb:schemaBindings>
            <jaxb:package name = "foo.set"/>
        </jaxb:schemaBindings>
        <jaxb:bindings node = "//xsd:complexType[@name='SomeType']">
            <jaxb:class name = "SetsSomeType"/>
        </jaxb:bindings>
        <jaxb:bindings node = "//xsd:complexType[@name='InfoType']">
            <jaxb:class name = "SetsInfoType"/>
        </jaxb:bindings>
        <jaxb:bindings node = "//xsd:complexType[@name='OpsType']">
            <jaxb:class name = "SetsOpsType"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>
настройка плагина jaxb2
<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxb2-maven-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <id>xsd-to-java</id>
                        <goals>
                            <goal>xjc</goal>
                        </goals>
                    </execution>
                </executions>

                <configuration>
                    <packageName>some.package.name.bindings</packageName>
                    <sources>
                        <source>src/main/xsd/package/messages.xsd</source>
                    </sources>
                    <xjbSources>
                        <xjbSource>src/main/xsd/package/bindings.xjb</xjbSource>
                    </xjbSources>
                    <xjbExcludeFilters>
                        <filter implementation = "org.codehaus.mojo.jaxb2.shared.filters.pattern.PatternFileFilter">
                            <patterns>
                                <pattern>\.xsd</pattern>
                            </patterns>
                        </filter>
                    </xjbExcludeFilters>
                    <!--<arguments>
                        <argument>-XautoNameResolution</argument>
                    </arguments>-->

                </configuration>
            </plugin>

Это привело к следующей ошибке:

org.xml.sax.SAXParseException: не внешний файл привязки. Корневой элемент должен быть {https://jakarta.ee/xml/ns/jaxb}bindings, но это {http://java.sun.com/xml/ns/jaxb}bindings

Я не могу понять, почему он настаивает на «https://jakarta/ee/xml/ns/jaxb»!

Кроме того, я также попытался добавить -XautoNameResolution в качестве аргумента в конфигурацию моего плагина и получил ту же ошибку.

Я также запускаю сборку с панели Maven в IntelliJ.

Есть идеи, что я мог упустить или неправильно настроить?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема https://jakarta/ee/xml/ns/jaxb заключается в том, что jaxb переместился с javax.xml.bind на jakarta.xml.bind в Java 17 (также SpringBoot 3 и Spring 6), нарушая всевозможные вещи. То же самое с javax.validation -> jakarta.validation.

В любом случае, взгляните на этот ответ, чтобы узнать, как исправить

Спасибо за быстрый ответ! Это исправило мою проблему (после рефакторинга множества импортов по всему проекту ;-))

millerbill3 19.04.2023 08:03

Другие вопросы по теме