如何将Spring ROO与maven多模块项目一起使用?

时间:2014-02-28 01:44:51

标签: java maven spring-roo multi-module

我正在尝试将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参与这个项目吗?

1 个答案:

答案 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以避免我未发现的这些陷阱,我会很高兴听到它们。