Maven JAXB - Как указать корневой узел для создания из XSD

у меня проблема. У меня есть действительно большой XSD-файл компании, который содержит определения многих объектов во многих системах. Я не хочу создавать некоторые классы Java в своем отдельном проекте из этого XSD, но я не хочу создавать все классы, определенные в XSD, потому что они мне просто не нужны.

Можно ли указать что-то вроде корневого узла XSD для создания классов Java с использованием JAXB в Maven?

Надеюсь, мой вопрос понятен :)


person Jiri Vlasimsky    schedule 07.06.2012    source источник


Ответы (2)


Ваш вопрос я вижу очень часто, я бы сказал, типичный для больших тел XSD.

К сожалению, я не знаю JAXB-способа управления процессом генерации, а не так, как вы хотите.

Альтернативное решение, которое я разработал для этого, поэтому мое предубеждение с этого момента основано на автоматическом рефакторинге XML-схемы (XSR). В основном он берет ваш XSD и из набора объектов XSD (в вашем случае, вероятно, несколько глобальных элементов и, возможно, некоторые типы) он генерирует подмножество XSD, которое будет содержать только необходимые элементы, без пуха. Проведение этих XSD через JAXB даст вам именно то, что вы хотите. Это касается QTAssistant и его функций XSR. Шаги высокого уровня:

  • построить новый файл XSR;
  • обратитесь к своим исходным XSD в коллекции схем XML
  • создать «релиз»: в этом вам поможет графический редактор. По сути, вы сопоставляете нужные объекты XSD верхнего уровня и новые расположения файлов XSD.
  • Создайте новые XSD.
  • Используйте новые XSD со своими артефактами.

QTAssistant поддерживает интеграцию командной строки с Maven через плагин Exec Maven, но только в Windows.

person Petru Gardea    schedule 07.06.2012
comment
Спасибо за ваш ответ. К сожалению, я не могу запустить внешнюю программу из своего приложения. Это часть большого бизнес-приложения, развернутого во многих средах. - person Jiri Vlasimsky; 12.06.2012
comment
Вы уже сказали, что хотите запустить JAXB через Maven... Тогда ваш комментарий сбивает с толку в контексте вопроса. Я бы предположил, что ваше приложение создается, когда вы пытаетесь создать классы JAXB. - person Petru Gardea; 12.06.2012
comment
Я не могу установить какую-либо внешнюю программу на все наши машины. Таким образом, Exec Maven Plugin — это хороший прогресс на моем компьютере для разработки (где я могу установить все, что захочу), но на производстве он бесполезен для меня, потому что я не могу установить какую-либо внешнюю программу. - person Jiri Vlasimsky; 13.06.2012

Существует плагин для создания классов Java, которые могут принимать аргументы XJC, которые могут быть перехватом внутри более сложных конфигураций. Но я с такими не знаком.

Взято из источника плагина:

/**
 * Space separated string of extra arguments,
 * for instance <code>-Xfluent-api -episode somefile</code>;
 * These will be passed on to XJC as
 * <code>"-Xfluent-api" "-episode" "somefile"</code> options.
 * 
 * @parameter expression="${xjc.arguments}"
 */
protected String arguments;

pom.xml пример конфигурации плагина:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.3.1</version>
<executions>
    <execution>
        <id>xjc</id>
        <phase>process-resources</phase>
        <goals>
            <goal>xjc</goal>
        </goals>
    </execution>
</executions>
<configuration>
    <packageName>package.name</packageName>
    <schemaDirectory>${basedir}/src/main/webapp/WEB-INF/xsd</schemaDirectory>
    <bindingDirectory>${basedir}/src/main/java</bindingDirectory>
</configuration>
</plugin>
person GallifreyanCode    schedule 07.06.2012
comment
Да, это, вероятно, правильный плагин для меня. Я немного смущен многими вариациями плагина jaxb2 maven. Похоже, все работают одинаково. Но использование этого подхода в сочетании с внешним видом файла привязки может решить мою проблему. Единственная проблема, которая у меня есть, заключается в том, что этот плагин jaxb2 не учитывает пространства имен как команду командной строки xjc. Команда Xjc обычно создает папки для каждого пространства имен, а исходники генерируются в этих папках в соответствии с их пространством имен. Этот плагин генерирует каждый класс Java в одну папку и вызывает повторяющиеся ошибки. Любой намек? :) - person Jiri Vlasimsky; 13.06.2012
comment
Можно ли вместо этого настроить плагин с помощью ‹аргументов› конфигурации командной строки или он работает только с дополнительными конфигурациями, не предусмотренными плагином? Решение, которое я нашел в Интернете, заключается в использовании разных xsd в разных блоках выполнения/конфигурации, как указано в ответ здесь... - person GallifreyanCode; 14.06.2012
comment
... При таком подходе кажется, что другой плагин jaxb maven предлагает более элегантную конфигурацию см. ответ о CXF Подключаемый модуль XJC Maven. Я знаю, что они имеют дело с разными плагинами Maven, что делает их более запутанными. Я упомянул тот, который работает для меня, у меня нет опыта с другими. Я надеюсь, что связанные ответы быстро обеспечат рабочую конфигурацию. (это не влезло в 1 комментарий) - person GallifreyanCode; 14.06.2012