Разница плагинов Maven JAXB

126

Я определил, что существуют два плагина JAXB для Maven 2 с разными конфигурациями.

Один от Sun: http://jaxb.dev.java.net/jaxb-maven2-plugin/ , другой от Mojohaus: http://mojohaus.org/jaxb2-maven-plugin/

Какой из этих двух плагинов можно порекомендовать?


Спасибо, Мэтт. В ходе моего небольшого исследовательского проекта я обнаружил, что есть еще один плагин от солнечных лучей:

<groupId>com.sun.tools.xjc.maven2</groupId>  
<artifactId>maven-jaxb-plugin</artifactId>  

и тот:

<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>

и все еще тот, что был от Codehouse.

CuH
источник

Ответы:

104

Подведем итоги. У нас есть:

  1. Maven-jaxb2-плагин ( https://github.com/highsource/maven-jaxb2-plugin )
  2. Maven-JAXB-плагин ( https://jaxb.dev.java.net/jaxb-maven2-plugin/ )
  3. jaxb2-Maven-плагин ( https://github.com/mojohaus/jaxb2-maven-plugin )

Судя по комментариям в этой ветке , я всегда использовал maven-jaxb2-plugin (т.е. плагин №1):

Что касается org.jvnet.jaxb2.maven2: maven-jaxb2-plugin по сравнению с com.sun.tools.xjc.maven2: maven-jaxb-plugin, с моей точки зрения, это определенно первый ( http: // maven-jaxb2 -plugin.java.net/ ).

Этот плагин имеет гораздо больше возможностей, чем com.sun.tools.xjc.maven2: maven-jaxb-plugin, разработка ведется. Наконец, я один из авторов :) и я бы сказал, что мы поддерживаем связь с разработчиками и пользователями JAXB и реагируем на последние функции / запросы.

И действительно, плагин №2 не очень активен (мертв?). И поскольку я всегда был доволен №1, я никогда не использовал плагин №3, поэтому ничего не могу сказать о нем. На всякий случай вот рабочая конфигурация плагина №1:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <inherited>true</inherited>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>generate</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
Паскаль Тивент
источник
1
Спасибо за конфиг. В конце концов, я использую плагин codehouse, который дает мне те же возможности для моих нужд. Насколько я видел, отличается только синтаксис.
cuh
А как насчет ws.apache.org/jaxme/mp, который упоминается непосредственно на сайте Maven?
rcl
1
@rcl: Ничего не могу сказать об этом, но поскольку он не обновлялся более 4 лет, я не уверен, что буду его использовать. Меня просто устраивает maven-jaxb2-plugin .
Паскаль Тивент
1
Что касается №1, сайт, на котором размещена документация, похоже, сегодня не работает. confluence.highsource.org/display/MJIIP/User+Guide Активен ли этот проект?
rds
2
@Gregor maven-jaxb2-pluginтеперь размещен на GitHub . Документация находится в вики .
lexicore 03
44

Недавно я попробовал три упомянутых выше плагина (также включенных сюда):

  1. плагин maven-jaxb2 ( http://maven-jaxb2-plugin.java.net/ )
  2. плагин maven-jaxb ( https://jaxb.dev.java.net/jaxb-maven2-plugin/)
  3. плагин jaxb2-maven ( http://mojo.codehaus.org/jaxb2-maven-plugin/ )

В итоге я использовал четвертый вариант: плагин CXF XJC Maven http://cxf.apache.org/cxf-xjc-plugin.html

Если мне не хватает чего-то, что я хотел бы знать, но конфигурация казалась более простой для того, что я пытался сделать, и более легко позволяла мне иметь дело с дублированием генерации классов в том же пространстве имен - аналогично этому вопросу: есть ли способ справиться с повторяющимися определениями элементов в нескольких файлах .xsd в JAXB? ,

Теперь у меня есть детальный контроль над каждым входящим XSD и соответствующим пакетом java; вот пример конфигурации, близкой к той, которую я использую.

 <plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-xjc-plugin</artifactId>
    <version>2.3.0</version>
    <configuration>
        <extensions>
            <extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:2.3.0</extension>
        </extensions>
    </configuration>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>xsdtojava</goal>
            </goals>
            <configuration>
                <sourceRoot>${basedir}/target/generated-sources/src/main/java</sourceRoot>
                <xsdOptions>
                    <xsdOption>
                        <xsd>src/main/resources/schema/commands.xsd</xsd> <!--shares a common.xsd file causing the conflicts-->
                        <packagename>com.foo.bar.commands</packagename>
                    </xsdOption>
                    <xsdOption>
                        <xsd>src/main/resources/schema/responses.xsd</xsd>
                        <packagename>com.foo.bar.responses</packagename>
                    </xsdOption>
                </xsdOptions>
            </configuration>
        </execution>
    </executions>
</plugin>
млрд.
источник
1
Отличное предложение. Я просто попробовал это, и это сработало как шарм - спасибо.
SGB
Кто-нибудь знает, есть ли для этого разъем Eclipse m2e? Я погуглил и не нашел. Надеюсь, я просто пропустил это, потому что мне нравится этот вариант.
user944849
cxf-xjc-plugin имеет коннектор Eclipse по состоянию на 2017 год. Но я не вижу проблемы с генерацией кода вручную при запуске maven и добавлении исходного каталога. Фактически, мой опыт показывает, что проекты со сгенерированными классами (JAXB, XMLBeans) лучше оставить закрытыми и зависеть от двоичной формы (jar). Тогда IDE работает быстрее и нет проблем с путями к классам (особенно с XMLBeans).
Vytenis Bivainis
Похоже, подключаемый модуль CXF XJC Maven поддерживает только создание источников Java из схемы и не может генерировать схему из аннотаций Jaxb.
alebu
19

Я автор maven-jaxb2-plugin .

В настоящее время плагин maven-jaxb2-plugin использует JAXB 2.1. В следующих версиях мы также предоставим версии JAXB 2.0 и JAXB 2.2.

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

lexicore
источник
Можно ли сгенерировать схемы из классов с помощью maven-jaxb2-plugin? Или плагин поддерживает только xsd-> Java?
Йорг
В настоящее время это только xsd-> java.
lexicore
Название maven-jaxb2-plugin не нарушает соглашения об именах плагинов Maven или это официальный плагин maven? Я не возражаю против названия, но, поскольку оно никогда не обновлялось, я думал, что плагин больше не будет поддерживаться.
FrVaBe
Плагин довольно старый, он был создан до того, как это стало общепринятым соглашением. И jaxb2-maven-plugin тогда уже был взят. Я считаю, что здесь важно избегать коллизии имен. Однако в настоящее время сборка плагинов даже обеспечивает соблюдение этих соглашений об именах, поэтому, вероятно, мне все равно придется мигрировать.
lexicore
3
@lanoxx Нет, это не так. Как правило, не рекомендуется составлять схемы из URL-адресов. Делайте локальные копии схем и используйте файлы каталога для перезаписи ссылок.
lexicore
3
  • maven-jaxb2-plugin использует эталонную реализацию JAXB от Oracle / Sun
  • cxf и jaxb2-maven-plugin используют Apache Xerces
выстр
источник
2

По небольшому поводу: возникла проблема с использованием maven-jaxb2-plugin с Eclipse Indigo, которую я разместил здесь . Недавно стало доступно исправление (расширение).

Это вовсе не означает несогласия с рекомендацией maven-jaxb2-plugin над maven2-jaxb-plugin. Я не знаю, но я ожидаю, что maven2-jaxb-plugin имеет ту же проблему, возможно, нерешенную.

Эд Стауб
источник
0

Я бы предположил, что один предназначен для исходной спецификации JAXB, а другой - для спецификации JAXB 2.1 (и если dev.java.net загрузится когда-нибудь в этом столетии, я могу сказать наверняка).

Мэтт Би
источник
Да, и если бы можно было загрузить плагин org.jvnet.jaxb2.maven2, я бы сравнил их. Поскольку репозиторий java не предоставляет плагин, он исключен из игры, хотя синтаксис конфигурации казался немного более удобным.
cuh