Maven Java generazione di codice sorgente per Hibernate
Domanda
Io occupato la conversione di un progetto esistente da una build Ant per uno utilizzando Maven. Parte di questa build include l'utilizzo lo strumento di sospensione hbm2java per convertire un insieme di file .hbm.xml in Java. Ecco un frammento dello script Ant utilizzato per fare questo:
<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 fare questo in modo che tutti i file .hbm.xml sono raccolti e la generazione del codice avviene come parte della fase di costruzione di generazione del codice Maven?
Grazie!
Adam.
Soluzione
Bene, c'è il Maven Hibernate3 Plugin se non si vuole mescolare Ant e Maven (che è una buona idea qui IMO). Ha un hbm2java
obiettivo che è vincolato da imposterà la 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>
Modifica Il plugin in realtà cerca .hbm.xml
in target/classes
per generare i file sorgente Java. Quindi, se si mette i file di mapping in src/main/resources
, avranno copiato in target/classes
durante la fase process-resources
che viene richiamato dal plugin e le cose solo di lavoro. 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 vuota, contiene solo la configurazione plug visto sopra ed 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, l'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.
Altri suggerimenti
Pascal, grazie ancora per il vostro aiuto! La soluzione funziona bene.
Un paio di altre cose che ho incontrato mentre si lavora su questo. La prima riguarda il fatto che questo è un abbastanza grande progetto e così ho diviso in più moduli Maven per rispecchiare l'originale formica costruzione multi-directory. Il modulo che contiene le classi generate in realtà non fa alcun accesso al database e quindi il file hibernate.cfg.xml non è necessario, e in questo caso non dovrebbe contenere tutte le informazioni di connessione DB. Ho provato questo fuori e funziona bene con una versione ridotta del file fornito da Pascal, con tutte le proprietà tag rimossi.
Con questo in luogo, la build ha funzionato bene dalla riga di comando. Tuttavia, Per quanto mi sforzassi, non riuscivo a persuadere gli altri moduli per raccogliere le classi generate quando viene eseguito 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 i file da generare in un luogo che eclissi li può pick up per gli altri moduli. Una volta fatto questo si deve fare una build sulla riga di comando e quindi richiedere che Eclipse aggiornare il contenuto della directory di origine per raccogliere i nuovi file. Per il momento, non so di un modo più pulito per gestire questa situazione ....
Se avete bisogno di includere * .hbm.xml sulla compilazione fase; 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>