[英]How to use Spring ROO with a maven multi-module project?
我正在嘗試使用Spring Roo(1.2.4)和maven多模塊項目,並且遇到很多困難。 我的實體在一個模塊中聲明,而webapp在另一個模塊中聲明。 顯然,webapp將實體模塊列為依賴項。
但是,每當我在webapp中打開ROO shell時,我都無法為任何@Roo注釋類型生成任何Roo Aspects。 例如,
@RooService(domainTypes = { com.ia.domain.User.class })
除非我的webapp項目包含com.ia.domain.User
類,否則沒有任何影響。 如果我將該實體保留在單獨的模塊中,則ROO不會生成任何服務方面。 如果我將實體添加到我的webapp項目中,ROO將生成必要的方面:
Created SRC_MAIN_JAVA/com/ia/service/UserService_Roo_Service.aj
Created SRC_MAIN_JAVA/com/ia/service/UserServiceImpl_Roo_Service.aj
但是,一旦我從項目中刪除了User類並將其保留在我的依賴項中,Roo就會刪除這些方面:
Deleted SRC_MAIN_JAVA/com/ia/service/UserService_Roo_Service.aj - empty
Deleted SRC_MAIN_JAVA/com/ia/service/UserServiceImpl_Roo_Service.aj - empty
是否有一種特殊的方法來配置Roo以支持多模塊,或者這是Roo的限制? 我沒有Roo參與這個項目嗎?
因此,在玩了幾個小時的ROO和我的多個maven項目並發現了幾件事之后。
首先,盡管我喜歡使用Roo,但我仍然認為它還沒有為企業級項目做好准備。 Roo似乎對pom.xml和applicationContext.xml文件的結構,設計和命名約定有太多的限制和強加。
我的多模塊項目結構如下:
+ Project Root
pom.xml (only lists modules)
+ parent-pom/
pom.xml (pom: lists all the project-level dependency versions/plugin versions/etc
+ entities/
pom.xml (jar: contains all the project's entities)
+ webapp/
pom.xml (war: contains the BO and webapp design)
雖然這對maven來說很好,但這對Roo來說並不好。 為了讓Roo將其視為一個多模塊項目,我必須按如下方式對其進行重組:
+ Project Root
pom.xml (lists all the project-level dependency versions/plugin versions/etc + modules)
+ entities/
pom.xml (jar: contains all the project's entities)
+ webapp/
pom.xml (war: contains the BO and webapp design)
不是最大的問題,但我寧願將父親pom作為自己的工件與模塊解除關聯。 不是Roo可以處理的東西。
此外,我不能讓子項目繼承父版本。 我必須在每個模塊中明確設置子版本,這需要更多的管理工作,而且不那么干凈。 所以目前,我已經將每個孩子定義為存在
<version>${project.parent.version}</version>
這是多余的,並且可能容易出現maven-release-plugin等錯誤。
此外,即使所有插件版本都在我父級的<pluginManagement>
部分中定義,所以孩子們也需要在他們的<plugins>
指定版本,這使得版本管理非常困難。 實際上,看起來<pluginManagement>
幾乎被Roo忽略了,因為每個子<pluginManagement>
都必須重復其他配置。
可能我對Roo最大的煩惱是我無法在我的pom.xml
指定自己的版本。 如果我想要一個Roo使用的特定版本的庫,Roo將覆蓋我指定的任何版本,並設置它自己的版本。 因此,如果我想使用更新版本的Spring lib(例如:Spring-Data),Roo將在每次嘗試創建存儲庫時繼續降級它。
所有這一切只是為了讓Roo將項目視為一個多模塊項目。 現在它是可見的,我發現我只能在父級別打開shell。 如果我打開一個孩子的Roo shell,它將刪除我原來的帖子中提到的任何Roo方面。 我需要打開父級的Roo shell,然后使用
module focus --moduleName entities
為孩子工作。 這意味着我總是需要在Eclipse / STS中打開/導入父項目,這可能並不總是我想做的事情。
下一個限制是,即使我切換到實體模塊,Roo也不會使用entity jpa --class ~.domain.User
為我創建實體,因為Roo不明白我的jpa設置是在我的webapp模塊中完成的。 所以我只能在與jpa設置相同的模塊中創建我的實體。
關於我的JPA設置,我將Spring配置為不使用persistence.xml
文件,而只使用LocalContainerEntityManagerFactoryBean
:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
<property name="packagesToScan" value="com.ia.domain"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.query.substitutions">true '1', false '0'</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.connection.charSet">UTF-8</prop>
</props>
</property>
</bean>
Roo不喜歡這樣,並堅持使用persistence.xml
文件, applicationContext-jpa.xml
文件, database.properties
文件(即使我希望所有數據庫配置都通過JNDI)和applicationContext.xml
事務配置applicationContext.xml
文件,即使我已經在applicationContext-hibernate.xml
文件中定義了所有配置。 可能不是最大的問題,但我不喜歡Roo強迫我的手並強加我的applicationContext文件的特定布局。 如果我想把它們稱為不同的東西,我甚至無法做到。
總的來說,我發現使用Roo很有趣,但所有這些限制讓我意識到它還沒有為大型項目開發做好准備。 即使我沒有使用Tiles2,我甚至無法讓它停止為Tiles2生成視圖!
如果有方法來定制/配置Roo以避免我沒有發現的這些陷阱,我會很高興聽到它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.