2009-12-14 13 views
6

Ich bin beschäftigt, ein vorhandenes Projekt von einem Ant-Build zu einem mit Maven zu konvertieren. Ein Teil dieses Builds umfasst die Verwendung des Hibernate-Tools hbm2java, um eine Sammlung von .hbm.xml-Dateien in Java zu konvertieren. Hier ist ein Ausschnitt des Ant-Skripts verwendet, um dies zu tun:Maven Java Quellcode-Generierung für Hibernate

<target name="dbcodegen" depends="cleangen" 
     description="Generate Java source from Hibernate XML"> 
    <hibernatetool destdir="${src.generated}"> 
    <configuration> 
     <fileset dir="${src.config}"> 
     <include name="**/*.hbm.xml"/> 
     </fileset> 
    </configuration> 
    <hbm2java jdk5="true"/> 
    </hibernatetool> 
</target> 

Ich habe einen Blick um im Internet und einige Leute scheinen, dies zu tun (ich glaube) mit Ant in Maven und andere mit dem Maven Plugin . Ich würde es lieber vermeiden, Ant und Maven zu mischen. Kann jemand eine Möglichkeit vorschlagen, dies zu tun, so dass alle .hbm.xml-Dateien aufgenommen werden und die Codegenerierung als Teil der Maven-Codegenerierungs-Erstellungsphase stattfindet?

Danke!

Adam.

+0

Die neue maven3 Konvention $ {project.build.directory}/erzeugt/Hibernate3/main/java statt $ zu sein scheint { project.build.directory}/generated/hibernate3 Ich habe Schwierigkeiten, eine Dokumentation zu finden, die dies unterstützt. Das neue m2Eclipse-Plugin scheint diese neue Konvention zu verwenden. Dies wird besonders deutlich, wenn Sie die Funktion "Projektkonfiguration aktualisieren" verwenden. –

Antwort

13

Nun, es gibt die Maven Hibernate3 Plugin, wenn Sie nicht wollen Ant und Maven (was eine gute Idee ist hier IMO). Es hat ein hbm2java Ziel, das standardmäßig an die generate-sources Phase gebunden ist. Finden Sie auf der Website des Mojo für mehr Details, aber das Setup des Plugins Macht sieht aus wie etwas wie folgt aus:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>hibernate3-maven-plugin</artifactId> 
    <version>2.2</version> 
    <executions> 
     <execution> 
     <phase>generate-sources</phase> 
     <goals> 
      <goal>hbm2java</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <components> 
     <component> 
      <name>hbm2java</name> 
      <implementation>configuration</implementation> 
      <outputDirectory>target/generated-sources/hibernate3</outputDirectory> 
     </component> 
     </components> 
     <componentProperties> 
     <drop>true</drop> 
     <jdk5>true</jdk5> 
     <configurationfile>/src/main/resources/hibernate.cfg.xml</configurationfile> 
     </componentProperties> 
    </configuration> 
    </plugin> 

EDIT: Das Plugin sieht eigentlich für .hbm.xml in target/classes zu erzeugen, um die Java-Quelldateien. Also, wenn Sie Ihre Mapping-Dateien in src/main/resources setzen, werden sie in target/classes während der process-resources Phase, die durch das Plugin aufgerufen wird, kopiert und die Dinge werden einfach funktionieren. Ich habe gerade dies mit dem folgenden Beispielprojekt getestet:

 
maven-hibernate3-testcase 
|-- pom.xml 
`-- src 
    |-- main 
    | |-- java 
    | `-- resources 
    |  |-- Person.hbm.xml 
    |  `-- hibernate.cfg.xml 
    `-- test 
     `-- java 

Die pom.xml fast leer ist, es enthält nur die Plugin-Konfiguration oben und eine junit Abhängigkeit gesehen. Die hibernate.cfg.xml enthält:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <!-- Database connection settings --> 
    <property name="connection.driver_class">org.apache.derby.jdbc.ClientDriver</property> 
    <property name="connection.url">jdbc:derby://localhost:1527/mydatabase</property> 
    <property name="connection.username">app</property> 
    <property name="connection.password">app</property> 

    <!-- JDBC connection pool (use the built-in) --> 
    <property name="connection.pool_size">1</property> 

    <!-- SQL dialect --> 
    <property name="dialect">org.hibernate.dialect.DerbyDialect</property> 

    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">false</property> 

    <!-- Mapping files --> 
    <mapping resource="Person.hbm.xml" /> 
    </session-factory> 
</hibernate-configuration> 

Und Person.hbm.xml sieht wie folgt:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-mapping 
    PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 

    <class name="Person" table="person"> 
    <id name="id" type="int"> 
     <generator class="increment" /> 
    </id> 

    <property name="name" column="cname" type="string" /> 
    </class> 

</hibernate-mapping> 

Mit dieser Konfiguration läuft mvn install erzeugt Person.java wie unten dargestellt:

$ cat target/generated-sources/hibernate3/Person.java 
// default package 
// Generated Dec 14, 2009 2:19:22 PM by Hibernate Tools 3.2.2.GA 



/** 
* Person generated by hbm2java 
*/ 
public class Person implements java.io.Serializable { 


    private int id; 
    private String name; 

    public Person() { 
    } 

    public Person(String name) { 
     this.name = name; 
    } 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 




} 

Alles wie beschrieben funktioniert.

+0

Danke Pascal! Ich denke, das ist ein guter Anfang, da es eindeutig eine All-Maven-Lösung gibt. Das einzige verbleibende Problem, das ich sehen kann, ist, dass es sich auf eine einzelne Konfigurationsdatei ("hibernate.cfg.xml") bezieht. Ich habe eine Reihe von Konfigurationsdateien, auf die im Ant-Skript mit dem Muster "**/*. Hbm.xml" verwiesen wird. Kann jemand das mit Maven und dem Plugin, das Pascal vorschlägt, machen? – Adam

+0

Ich habe meine Antwort aktualisiert, um diesen Teil abzudecken. –

+0

Vielen Dank! Bitte beachten Sie meine weiteren Kommentare unten. – Adam

0

Pascal, nochmals vielen Dank für Ihre Hilfe! Ihre Lösung funktioniert gut.

Ein paar andere Dinge, die ich während der Arbeit an diesem Thema begegnete. Die erste bezieht sich auf die Tatsache, dass dies ein ziemlich großes Projekt ist, und deshalb habe ich es in mehrere Maven-Module aufgeteilt, um den ursprünglichen Ameisen-Multi-Verzeichnis-Build zu spiegeln. Das Modul, das die generierten Klassen enthält, führt keinen Datenbankzugriff durch und daher muss die Datei hibernate.cfg.xml keine Datenbankverbindungsinformationen enthalten und sollte in diesem Fall keine DB-Verbindungsinformationen enthalten. Ich habe das ausprobiert und es funktioniert gut mit einer reduzierten Version der Datei von Pascal, mit allen Eigenschaften Tags entfernt.

Mit dieser Stelle funktionierte der Build von der Befehlszeile aus. Wie dem auch sei, ich konnte die anderen Module nicht davon überzeugen, die generierten Klassen zu übernehmen, wenn sie von Eclipse ausgeführt werden.Für den Augenblick, die Lösung, die ich dazu habe, ist die folgende Zeile in die POM unter Konfiguration/Komponenten/Komponenten hinzuzufügen:

<outputDirectory>/src/main/java</outputDirectory> 

Dies zwingt die Dateien an einem Ort erzeugt werden, die sie abholen verdunkeln kann für die anderen Module. Sobald dies erledigt ist, müssen Sie in der Befehlszeile einen Build erstellen und dann anfordern, dass Eclipse den Inhalt des Quellverzeichnisses aktualisiert, um die neuen Dateien aufzunehmen. Bis jetzt weiß ich nicht von einer saubereren Weise, damit umzugehen ....

+1

Froh, dass es hilfreich war. Ich habe ein paar Bemerkungen. Erstens ist es keine bewährte Methode, Code in 'src/main/java' zu generieren, generierter Code sollte wirklich in' target' gehen. Der Hauptgrund dafür ist, dass wir "sauber" reinigen wollen. Bei Eclipse muss das Verzeichnis, das den generierten Code enthält, in der Tat als "Quellordner" hinzugefügt werden. Wenn Sie das m2eclipse-Plugin verwenden, wird dies automatisch durchgeführt, wenn Sie mit der rechten Maustaste auf das Projekt klicken und dann * Maven> Projektkonfiguration aktualisieren * (siehe http://docs.codehous.org/display/M2ECLIPSE/Project+FAQ # ProjectFAQ-generiert). –

+0

Und wenn Sie das maven-eclipse-plugin verwenden, wird das Aufrufen von 'mvn eclipse: eclipse' einen' .classpath' erzeugen, der ebenfalls ein 'classpathetry' mit' target/hibernate3/generated-sources' enthält. In beiden Fällen müssen also keine Quellen unter 'src/main/java' erzeugt werden (was eine gute Sache ist). Zu guter Letzt, was den Inhalt meiner hibernate.cfg.xml angeht, war es natürlich nur ein Beispiel :) Viel Glück mit Ihrem Migrationsprozess! –

+0

Danke noch einmal! Ich benutze tatsächlich m2eclipse als ein Plugin und die Update-Projektkonfiguration hat den Trick gemacht und das Problem gelöst. Außerdem stimme ich deinem Punkt zu, den generierten Code an einem Ort zu halten, der mit den Klassen aufgeräumt werden kann. – Adam

0

Wenn Sie * .hbm.xml auf der Phasenkompilierung einschließen müssen; Bearbeiten Sie Ihre pom.xml und fügen Sie den nächsten Code:

<build> 
       <resources> 
      <resource> 
       <directory>source/com/qfund/orm/</directory> 
       <targetPath>com/qfund/orm/</targetPath> 
       <includes> 
        <include>*.hbm.xml</include> 
       </includes> 
      </resource> 
     </resources> 
     <testResources> 
      <testResource> 
       <directory>src/test/java/</directory> 
       <includes> 
        <include>*.xml</include> 
        <include>*.xsd</include> 
        <include>*.xslt</include> 
        <include>*.properties</include> 
       </includes> 
      </testResource> 
     </testResources> 
</build>