Różnica między wtyczkami Maven JAXB


126

Ustaliłem, że istnieją dwie wtyczki JAXB dla Maven 2 z różnymi konfiguracjami.

Jeden pochodzi z Sun: http://jaxb.dev.java.net/jaxb-maven2-plugin/ , drugi z Mojohaus: http://mojohaus.org/jaxb2-maven-plugin/

Którą z tych dwóch wtyczek można polecić?


Dzięki Matt. Podczas mojego małego projektu badawczego odkryłem, że istnieje całkiem inna wtyczka pochodząca od sunners:

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

i ten:

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

i wciąż ten z Codehouse.

Odpowiedzi:


104

Podsumujmy. Mamy:

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

Opierając się na komentarzach tego wątku , zawsze używałem wtyczki maven-jaxb2-plugin (tj. Wtyczki nr 1):

Jeśli chodzi o wtyczkę org.jvnet.jaxb2.maven2: maven-jaxb2-plugin versus com.sun.tools.xjc.maven2: maven-jaxb-plugin, z mojego punktu widzenia jest to zdecydowanie pierwsza ( http: // maven-jaxb2 -plugin.java.net/ ).

Ta wtyczka ma znacznie więcej funkcji niż com.sun.tools.xjc.maven2: maven-jaxb-plugin, rozwój jest aktywny. Wreszcie jestem jednym z autorów :) i powiedziałbym, że utrzymujemy kontakt z programistami i użytkownikami JAXB oraz reagujemy na najnowsze funkcje / prośby.

I rzeczywiście, wtyczka nr 2 nie jest bardzo aktywna (martwa?). A ponieważ zawsze byłem zadowolony z # 1, nigdy nie korzystałem z wtyczki # 3, więc tak naprawdę nie mogę nic o tym powiedzieć. Na wszelki wypadek, oto działająca konfiguracja dla wtyczki nr 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
Dzięki za config. W końcu korzystam z wtyczki Codehouse, która daje mi te same możliwości dla moich potrzeb. O ile widziałem, różni się tylko składnia.
cuh

A co z ws.apache.org/jaxme/mp, o którym wspomniano bezpośrednio na stronie Mavena?
rcl

1
@rcl: Nie mogę wiele o tym powiedzieć, ale ponieważ nie był aktualizowany od ponad 4 lat, nie jestem pewien, czy bym go użył. Jestem po prostu zadowolony z wtyczki maven-jaxb2-plugin .
Pascal Thivent

1
Jeśli chodzi o numer 1, wydaje się, że witryna przechowująca dokumentację jest dzisiaj niedostępna. confluence.highsource.org/display/MJIIP/User+Guide Czy ten projekt jest aktywny?
rds

2
@Gregor maven-jaxb2-pluginjest teraz hostowany na GitHub . Dokumentacja znajduje się na wiki .
leksykor

44

Niedawno wypróbowałem trzy wymienione powyżej wtyczki (również tutaj):

  1. wtyczka maven-jaxb2-plugin ( http://maven-jaxb2-plugin.java.net/ )
  2. wtyczka maven-jaxb-plugin ( https://jaxb.dev.java.net/jaxb-maven2-plugin/)
  3. wtyczka jaxb2-maven-plugin ( http://mojo.codehaus.org/jaxb2-maven-plugin/ )

Skończyło się na użyciu czwartej opcji: wtyczki CXF XJC Maven http://cxf.apache.org/cxf-xjc-plugin.html

Jeśli brakuje mi czegoś, co chciałbym wiedzieć, ale konfiguracja wydawała się prostsza dla tego, co próbowałem zrobić, i łatwiej pozwalała mi radzić sobie ze zduplikowanym generowaniem klas w tej samej przestrzeni nazw - podobnie do pytania: czy istnieje sposób radzenia sobie ze zduplikowanymi definicjami elementów w wielu plikach .xsd w JAXB? .

Mam teraz szczegółową kontrolę nad każdym przychodzącym XSD i odpowiadającym mu pakietem Java; oto przykładowa konfiguracja zbliżona do tej, której używam.

 <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
Doskonała sugestia. Właśnie tego spróbowałem i zadziałało jak urok - dziękuję.
SGB

Czy ktoś wie, czy jest do tego złącze Eclipse m2e? Poszukałem google i nie znalazłem żadnego. Mam nadzieję, że po prostu to przegapiłem, ponieważ podoba mi się ta opcja.
user944849

cxf-xjc-plugin ma złącze Eclipse od 2017 roku. Nie widzę jednak problemu z ręcznym wygenerowaniem kodu uruchamiającym maven i dodaniem katalogu źródłowego. W rzeczywistości z mojego doświadczenia wynika, że ​​projekty z wygenerowanymi klasami (JAXB, XMLBeans) lepiej pozostawić zamknięte i uzależnione w formie binarnej (jar). Wtedy IDE działa szybciej i nie ma problemów ze ścieżkami klas (szczególnie w przypadku XMLBeans).
Vytenis Bivainis

Wygląda na to, że dodatek CXF XJC Maven obsługuje tylko generowanie źródeł Java ze schematu i nie jest w stanie wygenerować schematu z adnotacji Jaxb.
alebu

19

Jestem autorem wtyczki maven-jaxb2-plugin .

Wtyczka maven-jaxb2-plugin używa obecnie JAXB 2.1. W kolejnych wersjach udostępnimy również wersje JAXB 2.0 i JAXB 2.2.

Jeśli chodzi o dyskusję „która wtyczka jest lepsza”, sprawdź funkcje , zdecyduj sam. Daj mi znać, jeśli przegapisz jakąś funkcjonalność.


Czy można generować schematy z klas za pomocą wtyczki maven-jaxb2? A może wtyczka obsługuje tylko xsd-> Java?
Jörg

Obecnie jest to tylko xsd-> java.
leksykor

Czy nazwa „maven-jaxb2-plugin” nie narusza konwencji nazewnictwa wtyczek Maven, czy też jest to oficjalna wtyczka Maven ? Nie przeszkadza mi nazwa, ale ponieważ nigdy nie była aktualizowana, pomyślałem, że wtyczka nie będzie już obsługiwana.
FrVaBe

Wtyczka jest dość stara, została przyjęta, zanim stała się ustaloną konwencją. Wtyczka jaxb2-maven była już wtedy zajęta. Myślę, że tutaj ważne jest, aby unikać kolizji nazw. Jednak obecnie kompilacja wtyczek wymusza nawet te konwencje nazewnictwa, więc prawdopodobnie i tak będę musiał przeprowadzić migrację.
leksykor

3
@lanoxx Nie, nie jest. Generalnie nie zaleca się kompilowania schematów z adresów URL. Twórz lokalne kopie schematów i używaj plików katalogów do przepisywania łączy.
leksykor

3
  • maven-jaxb2-plugin używa referencyjnej implementacji JAXB firmy Oracle / Sun
  • cxf i jaxb2-maven-plugin używają Apache Xerces

2

Z drobną uwagą: wystąpił problem z użyciem wtyczki maven-jaxb2-plugin do Eclipse Indigo, które zamieściłem tutaj . Niedawno udostępniono poprawkę (rozszerzenie).

Nie oznacza to, że w ogóle nie zgadzam się z zaleceniem maven-jaxb2-plugin zamiast maven2-jaxb-plugin. Nie wiem, ale spodziewam się, że maven2-jaxb-plugin ma ten sam problem, prawdopodobnie nierozwiązany.


0

Wydaje mi się, że jeden jest przeznaczony dla oryginalnej specyfikacji JAXB, a kodhaus dla specyfikacji JAXB 2.1 (i jeśli dev.java.net załadowałby się kiedyś w tym stuleciu, mogę to z całą pewnością stwierdzić).


Tak, i gdyby można było pobrać wtyczkę org.jvnet.jaxb2.maven2 , porównałbym je. Ponieważ repozytorium java nie zapewnia wtyczki, jest poza grą, chociaż składnia konfiguracji wydawała się nieco wygodniejsza.
cuh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.