Unterschied der Maven JAXB Plugins

126

Ich habe festgestellt, dass zwei JAXB- Plugins für Maven 2 mit unterschiedlichen Konfigurationen existieren.

Der eine ist von Sun: http://jaxb.dev.java.net/jaxb-maven2-plugin/ , der andere von Mojohaus: http://mojohaus.org/jaxb2-maven-plugin/

Welches dieser beiden Plugins kann empfohlen werden?


Danke Matt. Bei meinem kleinen Forschungsprojekt stellte ich fest, dass es ein ganz anderes Plugin gibt, das von den Sunners kommt:

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

und das:

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

und immer noch der von Codehouse.

cuh
quelle

Antworten:

104

Fassen wir zusammen. Wir haben:

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

Basierend auf den Kommentaren dieses Threads habe ich immer das maven-jaxb2-Plugin (dh Plugin # 1) verwendet:

In Bezug auf das org.jvnet.jaxb2.maven2: maven-jaxb2-plugin im Vergleich zu com.sun.tools.xjc.maven2: maven-jaxb-plugin ist es aus meiner Sicht definitiv das erste ( http: // maven-jaxb2) -plugin.java.net/ ).

Dieses Plugin hat viel mehr Funktionen als com.sun.tools.xjc.maven2: maven-jaxb-plugin, die Entwicklung ist aktiv. Schließlich bin ich einer der Autoren :) und ich würde sagen, wir bleiben mit JAXB-Entwicklern und -Nutzern in Kontakt und reagieren auf die neuesten Funktionen / Anforderungen.

Und tatsächlich ist das Plugin # 2 nicht sehr aktiv (tot?). Und weil ich immer mit # 1 zufrieden war, habe ich Plugin # 3 noch nie benutzt, kann also nichts dazu sagen. Nur für den Fall, hier ist eine funktionierende Konfiguration für Plugin # 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
quelle
1
Danke für die Konfiguration. Am Ende benutze ich das Codehouse-Plugin, das mir die gleichen Funktionen für meine Bedürfnisse bietet. Nur die Syntax unterscheidet sich soweit ich gesehen habe.
Cuh
Was ist mit ws.apache.org/jaxme/mp, das direkt auf Mavens Website erwähnt wird?
rcl
1
@rcl: Ich kann nicht viel darüber sagen, aber da es seit mehr als 4 Jahren nicht mehr aktualisiert wurde, bin ich mir nicht sicher, ob ich es verwenden würde. Ich bin nur glücklich mit dem maven-jaxb2-Plugin .
Pascal Thivent
1
Was # 1 betrifft, scheint die Site, auf der sich die Dokumentation befindet, heute nicht verfügbar zu sein. konfluenz.highsource.org/display/MJIIP/User+Guide Ist dieses Projekt so aktiv?
rds
2
@ Gregor maven-jaxb2-pluginwird jetzt auf GitHub gehostet . Die Dokumentation befindet sich im Wiki .
Lexicore
44

Ich habe kürzlich die drei oben genannten Plug-Ins ausprobiert (auch hier enthalten):

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

Am Ende habe ich eine vierte Option verwendet: Das CXF XJC Maven Plugin http://cxf.apache.org/cxf-xjc-plugin.html

Wenn mir etwas fehlt, das ich gerne wissen würde, aber die Konfiguration für das, was ich versuchte, einfacher zu sein schien und es mir leichter ermöglichte, mit der Erzeugung doppelter Klassen innerhalb desselben Namespace umzugehen - ähnlich wie bei dieser Frage: Gibt es eine Wie kann man mit doppelten Elementdefinitionen in mehreren .xsd-Dateien in JAXB umgehen?.

Ich habe jetzt eine detaillierte Kontrolle über jede eingehende XSD und das entsprechende Java-Paket. Hier ist eine Beispielkonfiguration in der Nähe der von mir verwendeten.

 <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.
quelle
1
Hervorragender Vorschlag. Ich habe es gerade versucht und es hat wie ein Zauber funktioniert - danke.
SGB
Weiß jemand, ob es dafür einen Eclipse m2e-Anschluss gibt? Ich habe gegoogelt und keinen gefunden. Ich hoffe, ich habe es einfach verpasst, weil mir diese Option gefällt.
user944849
Das cxf-xjc-Plugin verfügt ab 2017 über einen Eclipse-Connector. Ich sehe jedoch kein Problem darin, den Code zu generieren, der maven manuell ausführt und das Quellverzeichnis hinzufügt. Tatsächlich habe ich die Erfahrung gemacht, dass Projekte mit generierten Klassen (JAXB, XMLBeans) besser geschlossen bleiben und in einer binären Form (jar) abhängig sind. Dann arbeitet IDE schneller und es gibt keine Probleme mit Klassenpfaden (insbesondere bei XMLBeans).
Vytenis Bivainis
Das CXF XJC Maven Plugin unterstützt anscheinend nur das Generieren von Java-Quellen aus dem Schema und kann kein Schema aus Jaxb-Annotationen generieren.
Alebu
19

Ich bin der Autor von maven-jaxb2-Plugins .

Das maven-jaxb2-Plugin verwendet derzeit JAXB 2.1. In den nächsten Versionen werden wir auch die Versionen JAXB 2.0 und JAXB 2.2 bereitstellen.

Überprüfen Sie die Funktionen für die Diskussion "Welches Plugin ist besser?" Und entscheiden Sie selbst. Lassen Sie mich wissen, wenn Sie einige Funktionen vermissen.

Lexicore
quelle
Ist es möglich, mit dem maven-jaxb2-Plugin Schemas aus Klassen zu generieren? Oder unterstützt das Plugin nur xsd-> Java?
Jörg
Derzeit ist es nur xsd-> java.
Lexicore
Verstößt der Name 'maven-jaxb2-plugin' nicht gegen die Namenskonventionen des Maven-Plugins oder handelt es sich um ein offizielles Maven-Plugin? Ich habe nichts gegen den Namen, aber da er nie aktualisiert wurde, dachte ich, dass das Plugin nicht mehr gepflegt werden würde.
FrVaBe
Das Plugin ist ziemlich alt, es wurde eingeführt, bevor dies zu einer etablierten Konvention wurde. Und das jaxb2-maven-Plugin wurde schon damals genommen. Ich denke, es ist wichtig, hier eine Namenskollision zu vermeiden. Heutzutage erzwingt der Plugin-Build jedoch sogar diese Namenskonventionen, sodass ich wahrscheinlich trotzdem migrieren muss.
Lexicore
3
@lanoxx Nein, das ist es nicht. Es wird im Allgemeinen nicht empfohlen, Schemas aus URLs zu kompilieren. Erstellen Sie lokale Kopien von Schemas und verwenden Sie Katalogdateien, um Links neu zu schreiben.
Lexicore
3
  • Das maven-jaxb2-Plugin verwendet die JAXB-Referenzimplementierung von Oracle / Sun.
  • cxf und jaxb2-maven-plugin verwenden Apache Xerces
rds
quelle
2

Eine leichte Tangente: Es gab ein Problem mit der Verwendung des Maven-Jaxb2-Plugins mit Eclipse Indigo, das ich hier gepostet habe . Ein Fix (Erweiterung) ist seit kurzem verfügbar.

Dies soll der Empfehlung des Maven-Jaxb2-Plugins gegenüber dem Maven2-Jaxb-Plugin überhaupt nicht widersprechen. Ich weiß es nicht, aber ich gehe davon aus, dass das maven2-jaxb-Plugin das gleiche Problem hat, wahrscheinlich ungelöst.

Ed Staub
quelle
0

Ich würde vermuten, dass eines für die ursprüngliche JAXB-Spezifikation und das Codehaus für die JAXB 2.1-Spezifikation ist (und wenn dev.java.net dieses Jahrhundert einige Zeit laden würde, könnte ich sicher sagen).

matt b
quelle
Ja, und wenn es möglich wäre, das Plugin org.jvnet.jaxb2.maven2 herunterzuladen, würde ich sie vergleichen. Da das Repo von Java das Plugin nicht bereitstellt, ist es nicht im Spiel, obwohl die Konfigurationssyntax etwas praktischer zu sein schien.
Cuh