2009-12-14 37 views
6

Tôi đang bận chuyển đổi một dự án hiện có từ một bản dựng Ant thành một bằng Maven. Một phần của bản xây dựng này bao gồm sử dụng công cụ hbm2java hibernate để chuyển đổi một tập hợp các tệp .hbm.xml thành Java. Dưới đây là một đoạn script Ant sử dụng để làm điều này:Tạo mã nguồn Java Maven cho 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> 

Tôi đã có một cái nhìn xung quanh trên internet và một số người dường như để làm điều này (tôi nghĩ) sử dụng Ant trong Maven và những người khác với các plugin Maven . Tôi muốn tránh trộn Ant và Maven. Bất cứ ai có thể đề xuất một cách để làm điều này để tất cả các tệp .hbm.xml được chọn và việc tạo mã diễn ra như một phần của giai đoạn xây dựng tạo mã Maven?

Cảm ơn!

Adam.

+0

Quy ước maven3 mới dường như là $ {project.build.directory}/tạo/hibernate3/main/java hơn $ { project.build.directory}/generated/hibernate3 Tôi đang gặp khó khăn khi tìm tài liệu để hỗ trợ việc này. Plugin m2Eclipse mới dường như sử dụng quy ước mới này. Điều này đặc biệt rõ ràng khi sử dụng tính năng "Cấu hình dự án cập nhật". –

Trả lời

13

Vâng, có Maven Hibernate3 Plugin nếu bạn không muốn kết hợp Ant và Maven (đây là ý tưởng hay ở đây IMO). Nó có một mục tiêu hbm2java được ràng buộc theo mặc định cho giai đoạn generate-sources. Tham khảo các trang web của Mojo để biết thêm chi tiết nhưng các thiết lập của sức Plugin trông giống như một cái gì đó như thế này:

<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: Plugin thực sự trông cho .hbm.xml trong target/classes để tạo ra các tập tin nguồn java. Vì vậy, nếu bạn đặt các tệp ánh xạ của mình trong src/main/resources, chúng sẽ được sao chép vào target/classes trong giai đoạn process-resources được gọi bởi plugin và mọi thứ sẽ hoạt động. Tôi vừa mới thử nghiệm này với các dự án mẫu sau:

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

Các pom.xml là gần như trống rỗng, nó chỉ chứa các cấu hình Plugin thấy ở trên và một phụ thuộc junit. Các hibernate.cfg.xml chứa:

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

Person.hbm.xml trông như sau:

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

Với cấu hình này, chạy mvn install tạo Person.java như hình dưới đây:

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




} 

Tất cả mọi thứ hoạt động như mô tả.

+0

Cảm ơn Pascal! Tôi nghĩ rằng đây là một khởi đầu tốt vì nó rõ ràng đưa ra một giải pháp "tất cả Maven". Vấn đề duy nhất còn lại mà tôi có thể thấy là nó đề cập đến một tệp cấu hình duy nhất ("hibernate.cfg.xml"). Tôi có một tập hợp các tệp cấu hình, được nhắc đến trong kịch bản lệnh Ant sử dụng mẫu "**/*. Hbm.xml". Có ai biết làm thế nào để làm điều này bằng cách sử dụng Maven và các plugin mà Pascal đề nghị? – Adam

+0

Tôi đã cập nhật câu trả lời của mình để đề cập đến phần đó. –

+0

Rất cám ơn! Xin vui lòng xem thêm ý kiến ​​của tôi dưới đây. – Adam

0

Pascal, một lần nữa xin cảm ơn sự giúp đỡ của bạn! Giải pháp của bạn hoạt động tốt.

Một vài điều khác tôi gặp phải khi làm việc về điều này. Việc đầu tiên liên quan đến thực tế rằng đây là một dự án khá lớn và vì vậy tôi đã chia nó thành nhiều mô-đun Maven để phản ánh bản gốc kiến ​​xây dựng đa thư mục. Module có chứa các lớp được tạo ra không thực sự thực hiện bất kỳ truy cập cơ sở dữ liệu nào và do đó tệp hibernate.cfg.xml không cần, và trong trường hợp này không nên chứa bất kỳ thông tin kết nối DB nào. Tôi đã cố gắng này ra và nó hoạt động tốt với một phiên bản cắt giảm của tập tin được cung cấp bởi Pascal, với tất cả các thẻ thuộc tính loại bỏ.

Với điều này tại chỗ, bản dựng hoạt động tốt từ dòng lệnh. Tuy nhiên, hãy thử như tôi có thể, tôi không thể thuyết phục các mô-đun khác để nhận các lớp được tạo ra khi chạy từ Eclipse.Đối với thời điểm hiện tại, giải pháp tôi phải đây là thêm dòng sau vào POM theo cấu hình/thành phần/phần:

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

Điều này buộc các tập tin được tạo ra ở một nơi mà che khuất có thể chọn chúng cho các mô-đun khác. Một khi điều này được thực hiện, bạn phải thực hiện xây dựng trên dòng lệnh và sau đó yêu cầu Eclipse làm mới nội dung của thư mục nguồn để nhận các tệp mới. Tuy nhiên, tôi không biết cách nào khác để xử lý việc này ...

+1

Rất vui vì nó hữu ích. Tôi có một vài nhận xét mặc dù. Đầu tiên, không phải là cách hay nhất để tạo mã trong 'src/main/java', mã được tạo nên thực sự đi vào' target'. Lý do chính đằng sau đó là chúng tôi muốn "sạch" để làm sạch chúng. Sau đó, về Eclipse, thư mục chứa mã được tạo ra thực sự được thêm vào dưới dạng "thư mục nguồn". Nếu bạn đang sử dụng plugin m2eclipse, điều này sẽ được thực hiện tự động nếu bạn nhấp chuột phải vào dự án và sau đó * Maven> Cập nhật Cấu hình Dự án * (xem http://docs.codehaus.org/display/M2ECLIPSE/Project+FAQ # ProjectFAQ được tạo). –

+0

Và nếu bạn đang sử dụng maven-eclipse-plugin, hãy gọi 'mvn eclipse: eclipse' sẽ tạo ra' .classpath' chứa 'classpathentry' với' target/hibernate3/generated-sources' ra khỏi hộp. Vì vậy, trong cả hai trường hợp, không cần phải tạo nguồn dưới 'src/main/java' (đó là một điều tốt). Cuối cùng, liên quan đến nội dung của hibernate.cfg.xml của tôi, nó là tất nhiên chỉ là một ví dụ :) Chúc may mắn với quá trình di trú của bạn! –

+0

Cảm ơn một lần nữa! Tôi thực sự sử dụng m2eclipse như là một plugin và Cấu hình dự án cập nhật đã làm các trick và sắp xếp ra vấn đề. Ngoài ra, tôi đồng ý với quan điểm của bạn về việc giữ mã được tạo ra ở độ dài cánh tay ở một nơi có thể được dọn dẹp với các lớp học. – Adam

0

Nếu bạn cần bao gồm * .hbm.xml trong giai đoạn biên dịch; sửa pom.xml của bạn và thêm mã tiếp theo:

<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> 
Các vấn đề liên quan