【问题标题】:How to use Spring ROO with a maven multi-module project?如何在 Maven 多模块项目中使用 Spring ROO?
【发布时间】:2014-02-28 01:44:50
【问题描述】:

我正在尝试将 Spring Roo (1.2.4) 与 Maven 多模块项目一起使用,但遇到了很多困难。我的实体在一个模块中声明,webapp 在另一个模块中声明。显然,webapp 将实体模块列为依赖项。

但是,每当我在 web 应用程序中打开 ROO shell 时,我都无法为任何 @Roo 注释类型生成任何 Roo 方面。例如,

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

【问题讨论】:

标签: java maven spring-roo multi-module


【解决方案1】:

所以在玩了几个小时的 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 等错误。

此外,即使所有插件版本都在我父级的&lt;pluginManagement&gt; 部分中定义,子级也都需要在其&lt;plugins&gt; 中指定版本,这使得版本管理非常困难。事实上,&lt;pluginManagement&gt; 似乎几乎被 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 以避免这些我没有发现的陷阱,我会很高兴听到这些。

【讨论】:

  • 如果您可以在 JIRA jira.springsource.org/browse/ROO 上创建这些问题,那就太好了
  • @eruiz - 这里有很多问题,但都交织在一起。有什么建议可以在 Jira 中分解它们吗?
  • 我只看到对覆盖依赖版本的支持,请注意,Roo 不可能控制所有可能的变体来做某事,因此 Roo 仅以一种方式设置您的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2015-10-10
  • 2013-12-15
  • 2020-04-01
  • 2018-09-17
  • 2014-06-02
相关资源
最近更新 更多