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.

cuh
źródło

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>
Pascal Thivent
źródło
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>
bn.
źródło
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ść.

leksykor
źródło
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
rds
źródło
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.

Ed Staub
źródło
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ć).

matowe b
źródło
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