2009-12-14 19 views
6

Mevcut bir projeyi bir Ant derdinden Maven kullanarak bir tanesine dönüştürme ile uğraşıyorum. Bu derlemenin bir kısmı, .hbm.xml dosyalarını bir topluluğa dönüştürmek için hazırda bulunan hbm2java aracını kullanmayı içerir. İşte bunun için kullanılan Ant senaryonun bir parçacık İşte: internette bir göz yaşadımMaven Java Kaynak Kodu Hazırda Bekletme için Hazırlık

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

ve bazı insanlar Maven'in eklenti ile Maven içinde Ant ve diğerlerini kullanarak (Sanırım) bunu görünmektedir . Ant ve Maven'i karıştırmayı tercih ederim. Herkes bunu yapmak için bir yol önerebilir, böylece tüm .hbm.xml dosyaları alınır ve kod üretimi Maven kod oluşturma inşa aşamasının bir parçası olarak gerçekleşir mi?

Teşekkürler!

Adam.

+0

project.build.directory}/created/hibernate3 Bunu desteklemek için belgeler bulmakta zorlanıyorum. Yeni m2Eclipse eklentisi bu yeni sözleşmeyi kullanıyor gibi görünüyor. Bu, "Proje Yapılandırmasını Güncelle" özelliğini kullanırken özellikle belirgindir. –

cevap

13

Ant ve Maven'i (burada IMO hakkında iyi bir fikir) karıştırmak istemiyorsanız, Maven Hibernate3 Plugin var. Varsayılan olarak generate-sources fazına bağlı olan bir hbm2java hedefine sahiptir. Daha fazla ayrıntı için Mojo web sitesine bakın ama eklenti kudretini kurulumu böyle bir şey gibi görünür:

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

DÜZENLEME: eklentisi aslında görünüyortarget/classes yılında .hbm.xml için java kaynak dosyalarını oluşturmak için. Dolayısıyla, eşleme dosyalarınızı src/main/resources içine koyarsanız, bunlar eklenti tarafından çalıştırılan process-resources aşamasında target/classes'a kopyalanır ve işler sadece çalışır. Sadece aşağıdaki örnek proje ile test ettik:

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

pom.xml neredeyse boş, sadece yukarıda görülen eklenti yapılandırma ve bir junit bağımlılık içerir. hibernate.cfg.xml içerir:

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

Ve Person.hbm.xml aşağıdaki gibidir arar: Bu yapılandırma ile

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

, mvn installPerson.java üretir çalışan aşağıda gösterildiği gibi: anlatıldığı gibi

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




} 

Her şey çalışır.

+0

Teşekkürler Pascal! Bence bu, "tüm Maven" çözümünü açıkça verdiği için iyi bir başlangıç. Görebildiğim tek sorun, tek bir yapılandırma dosyasına ("hibernate.cfg.xml") başvurmasıdır. "**/*. Hbm.xml" desenini kullanarak Ant komut dosyasında belirtilen bir dizi yapılandırma dosyası var. Maven ve Pascal'ın önerdiği eklentiyi kullanarak bunu nasıl yapacaklarını bilen var mı? – Adam

+0

Cevabımı o bölümü kapsayacak şekilde güncelledim. –

+0

Çok teşekkürler! Lütfen aşağıdaki diğer yorumlarıma bakın. – Adam

0

Pascal, yardımlarınız için tekrar teşekkürler! Çözümünüz iyi çalışıyor.

Bunun üzerinde çalışırken karşılaştığım birkaç şey. Birincisi, bunun oldukça büyük bir proje olduğu gerçeğiyle ilgilidir ve bu yüzden orijinal karınca çoklu dizin yapısını yansıtmak için birden fazla Maven modülüne bölüştürüyorum. Oluşturulan sınıfları içeren modül aslında hiçbir veritabanı erişimi yapmaz ve böylece hibernate.cfg.xml dosyası gerekmez ve bu durumda, herhangi bir DB bağlantı bilgisi içermemelidir. Bunu denedim ve Pascal tarafından sağlanan tüm dosya etiketleri kaldırılmış dosyanın bir kesim sürümü ile gayet iyi çalışıyor.

Bu işlemle, derleme komut satırından düzgün çalıştı. Ancak, olabildiğince deneyin, Eclipse'den çalıştırıldığında oluşturulan diğer dersleri almak için diğer modülleri ikna edemedim.

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

Bu dosyalar bunları alabilirsiniz Tutulma bir yerde oluşturulacak zorlar: Şu an için, bu gerek çözüm yapılandırması/bileşenleri/bileşen kapsamında POM içine aşağıdaki satırı eklemektir Diğer modüller için. Bu yapıldıktan sonra komut satırında bir derleme yapmalı ve sonra yeni dosyaların alınması için Eclipse'in kaynak dizininin içeriğini yenilemesini istemelisiniz. Henüz, bu işlemek için daha temiz bir yol bilmiyorum.

+1

Sevindim yardımcı oldu. Yine de birkaç sözüm var. Birincisi, 'src/main/java'da kod üretmek için en iyi uygulama değil, oluşturulan kod gerçekten 'target' içinde olmalıdır. Bunun arkasındaki temel sebep, onları temizlemek için 'temiz' olmasını istiyoruz. Ardından, Eclipse hakkında, oluşturulan kodu içeren dizin gerçekten "kaynak klasör" olarak eklenmelidir. Eğer m2eclipse eklentisini kullanıyorsanız, projeye sağ tıklarsanız otomatik olarak yapılacaktır. * Maven> Proje Yapılandırması Güncelleme * (bkz. Http://docs.codehaus.org/display/M2ECLIPSE/Project+FAQ # ProjectFAQ oluşturulmuş). –

+0

Ve eğer maven-eclipse-plugin kullanıyorsanız, 'mvn eclipse: eclipse '' i çağırmak, kutudan da' target/hibernate3/generated-sources' ile 'classpathentry' içeren bir' .classpath' oluşturacaktır. Yani, her iki durumda da, 'src/main/java' altında kaynak üretmeye gerek yoktur (bu iyi bir şeydir). Son olarak, benim hibernate.cfg.xml içeriğiyle ilgili olarak, bu sadece bir örnek oldu :) Göç sürecinize iyi şanslar! –

+0

Bir kez daha teşekkürler! Ben gerçekten bir eklenti olarak m2eclipse kullanıyorum ve Güncelleme Proje Yapılandırma hile yaptım ve sorunu sıraladı. Ayrıca, oluşturulan kodu, sınıflar ile temizlenebilecek bir yerde kol uzunluğunda tutmakla ilgili fikrinize katılıyorum. – Adam

0

Eğer faz derlemesine * .hbm.xml eklemeniz gerekiyorsa; senin pom.xml düzenlemek ve sonraki kodu ekleyin: Yeni maven3 kongre $ {project.build.directory}/üretilen/Hibernate3/ana/java yerine $ {görünüyor

<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> 
İlgili konular