2009-12-14 19 views
6

Sono impegnato a convertire un progetto esistente da una build Ant a uno utilizzando Maven. Parte di questa build include l'utilizzo dello strumento hberner hberny per convertire una raccolta di file .hbm.xml in Java. Ecco un frammento dello script Ant utilizzato per fare questo:Generazione codice sorgente Java Maven per 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> 

ho dato un'occhiata in giro su internet e alcune persone sembrano fare questo (credo) usando Ant all'interno di Maven e altri con il plugin Maven . Preferirei evitare di mescolare Ant e Maven. Qualcuno può suggerire un modo per farlo in modo che tutti i file .hbm.xml vengano raccolti e la generazione del codice avvenga come parte della fase di generazione del codice Maven?

Grazie!

Adam.

+0

La nuova convenzione maven3 sembra essere $ {} project.build.directory/generata/Hibernate3/main/java piuttosto che $ { project.build.directory}/generated/hibernate3 Ho difficoltà a trovare la documentazione per supportare questo. Il nuovo plugin m2Eclipse sembra utilizzare questa nuova convenzione. Ciò è particolarmente evidente quando si utilizza la funzione "Aggiorna configurazione progetto". –

risposta

13

Bene, c'è il Maven Hibernate3 Plugin se non si vuole mescolare Ant e Maven (che è una buona idea qui IMO). Ha un obiettivo hbm2java che è associato per impostazione predefinita alla fase generate-sources. Fare riferimento al sito web del Mojo per maggiori dettagli, ma la messa a punto della potenza plug-in si presenta come qualcosa di simile a questo:

<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: Il plugin sembra in realtà per .hbm.xml in target/classes per generare i file sorgente Java. Quindi, se inserisci i file di mappatura in src/main/resources, verranno copiati in target/classes durante la fase process-resources che viene richiamata dal plug-in e le cose funzioneranno. Ho appena provato questo con il seguente progetto di esempio:

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

Il pom.xml è quasi vuoto, contiene solo la configurazione del plugin visto sopra e una dipendenza JUnit. Il hibernate.cfg.xml contiene:

<?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> 

E Person.hbm.xml appare come segue:

<?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> 

Con questa configurazione, esecuzione mvn install genera Person.java come illustrato di seguito:

$ 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; 
    } 




} 

Tutto funziona come descritto.

+0

Grazie Pascal! Penso che questo sia un buon inizio dato che fornisce chiaramente una soluzione "all Maven". L'unico problema rimanente che riesco a vedere è che si riferisce a un singolo file di configurazione ("hibernate.cfg.xml"). Ho una serie di file di configurazione, a cui si fa riferimento nello script Ant usando lo schema "**/*. Hbm.xml". Qualcuno sa come farlo usando Maven e il plugin suggerito da Pascal? – Adam

+0

Ho aggiornato la mia risposta per coprire quella parte. –

+0

Mille grazie! Si prega di vedere i miei ulteriori commenti qui sotto. – Adam

0

Pascal, grazie ancora per il vostro aiuto! La tua soluzione funziona bene.

Un paio di altre cose che ho incontrato mentre lavoravo a questo. Il primo si riferisce al fatto che si tratta di un progetto abbastanza grande e quindi l'ho diviso in più moduli Maven per rispecchiare la build di più directory delle formiche originali. Il modulo che contiene le classi generate in realtà non fa alcun accesso al database e quindi il file hibernate.cfg.xml non ha bisogno e, in questo caso, non dovrebbe contenere alcuna informazione di connessione DB. Ho provato questo e funziona bene con una versione ridotta del file fornito da Pascal, con tutte le proprietà tag rimossi.

Con questo al suo posto, la build ha funzionato bene dalla riga di comando. Tuttavia, prova come potrei, non potrei convincere gli altri moduli a raccogliere le classi generate quando vengono eseguite da Eclipse.Per il momento, la soluzione che ho a questo è di aggiungere la seguente riga nel POM in Configurazione/componenti/component:

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

In questo modo il file da generare in un luogo che eclissi li può raccogliere per gli altri moduli. Una volta eseguita questa operazione, è necessario creare una build dalla riga di comando e quindi richiedere ad Eclipse di aggiornare i contenuti della directory di origine per raccogliere i nuovi file. Per ora, non conosco un modo più pulito per gestire questo ....

+1

Sono contento che sia stato utile. Ho un paio di osservazioni però. Innanzitutto, non è una buona pratica generare codice in 'src/main/java', il codice generato dovrebbe andare in' target'. Il motivo principale dietro questo è che vogliamo 'clean' per pulirli. Quindi, su Eclipse, la directory che contiene il codice generato deve essere effettivamente aggiunta come "cartella sorgente". Se utilizzi il plug-in m2eclipse, questo verrà eseguito automaticamente se fai clic con il tasto destro del mouse sul progetto e poi su * Maven> Aggiorna configurazione progetto * (vedi http://docs.codehaus.org/display/M2ECLIPSE/Project+FAQ # ProjectFAQ generati). –

+0

E se si sta utilizzando il plugin maven-eclipse, invocando 'mvn eclipse: eclipse' genererà un' .classpath' che contiene un 'classpathentry' con' target/hibernate3/generated-sources' anche fuori dalla scatola. Quindi, in entrambi i casi, non c'è bisogno di generare fonti sotto 'src/main/java' (che è una buona cosa). Infine, per quanto riguarda il contenuto del mio hibernate.cfg.xml, era ovviamente solo un esempio :) Buona fortuna con il tuo processo di migrazione! –

+0

Grazie ancora! In effetti sto usando m2eclipse come plugin e l'Update Project Configuration ha fatto il trucco e risolto il problema. Inoltre, sono d'accordo con il punto su come mantenere il codice generato a distanza di sicurezza in un posto che può essere ripulito con le classi. – Adam

0

Se è necessario includere * .hbm.xml nella fase di compilazione; modificare il pom.xml e aggiungere il codice seguente:

<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> 
Problemi correlati