我正在尝试将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参与这个项目吗?
答案 0 :(得分:3)
因此,在玩了几个小时的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忽略了,因为每个孩子都必须重复其他配置。
可能我对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-hibernate.xml
文件中定义了所有配置。可能不是最大的问题,但我不喜欢Roo强迫我的手并强加我的applicationContext文件的特定布局。如果我想把它们称为不同的东西,我甚至都不能。
总的来说,我发现使用Roo很有趣,但所有这些限制让我意识到它还没有为大型项目开发做好准备。即使我没有使用Tiles2,我甚至无法让它停止为Tiles2生成视图!
如果有方法可以自定义/配置Roo以避免我未发现的这些陷阱,我会很高兴听到它们。