所以在玩了几个小时的 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)
不是最大的问题,但我宁愿将 parent-pom 作为自己的工件与模块分离。不是 Roo 可以处理的。
此外,我不能让子项目继承父版本。我必须在每个模块中显式设置子版本,这样管理起来更费力,而且不太干净。所以目前,我已经将每个孩子定义为
<version>${project.parent.version}</version>
这只是多余的,并且可能容易出现 maven-release-plugin 等错误。
此外,即使所有插件版本都在我父级的<pluginManagement> 部分中定义,子级也都需要在其<plugins> 中指定版本,这使得版本管理非常困难。事实上,<pluginManagement> 似乎几乎被 Roo 忽略了,因为甚至必须在每个孩子中重复额外的配置。
我对 Roo 最大的不满可能是我无法在我的 pom.xml 中指定我自己的版本。如果我想要 Roo 使用的库的特定版本,Roo 将覆盖我指定的任何版本,并设置它自己的版本。因此,如果我想使用更新版本的 Spring 库(例如: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)和事务配置987654337@ 文件,即使我已经在applicationContext-hibernate.xml 文件中定义了所有配置。可能不是最大的问题,但我不喜欢 Roo 强迫我的手并强加我的 applicationContext 文件的特定布局的事实。如果我想给它们起不同的名字,我什至不能。
总的来说,我发现 Roo 使用起来很有趣,但所有这些限制让我意识到它还没有准备好用于大型项目的开发。即使我没有使用 Tiles2,我什至无法让它停止为 Tiles2 生成视图!
如果有办法自定义/配置 Roo 以避免这些我没有发现的陷阱,我会很高兴听到这些。