java - 如何在 Maven 多模块项目中使用 Spring ROO?

标签 java maven spring-roo multi-module

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

但是,每当我在 webapp 中打开 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 而无法完成这个项目?

最佳答案

所以在玩 ROO 和我的 multi-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 作为它自己的 Artifact 与模块分离。不是 Roo 可以处理的事情。

此外,我不能让子项目继承父版本。我必须在每个模块中显式设置子版本,这样管理起来更费力,而且不太干净。所以目前,我已经将每个 child 定义为

<version>${project.parent.version}</version>

这只是多余的,并且可能容易出现 maven-release-plugin 等错误。

此外,即使所有插件版本都在我的 <pluginManagement> 中定义在我 parent 的部分, children 都需要在他们的 <plugins> 中指定版本同样,这使得版本管理极其困难。事实上,看起来 <pluginManagement>几乎被 Roo 忽略,因为甚至必须在每个 child 中重复额外的配置。

我对 Roo 最大的不满可能是我无法在我的 pom.xml 中指定我自己的版本。 .如果我想要 Roo 使用的库的特定版本,Roo 将覆盖我指定的任何版本,并在适当的位置设置它自己的版本。因此,如果我想使用更新版本的 Spring 库(例如:Spring-Data),每次我尝试创建存储库时,Roo 都会不断降级它。

所有这一切只是为了让 Roo 将项目视为一个多模块项目。既然可见,我发现我只能在父级别打开shell。如果我在 child 身上打开 Roo 外壳,它将删除我原始帖子中提到的任何 Roo 方面。我需要在父级上打开 Roo shell,然后使用

module focus --moduleName entities 

为 child 工作。这意味着我总是需要在 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 生成 View !

如果有自定义/配置 Roo 的方法来避免这些我还没有发现的陷阱,我会很高兴听到它们。

关于java - 如何在 Maven 多模块项目中使用 Spring ROO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22084549/

相关文章:

java - 当您不关闭 HBase 表时会发生什么?

java - Hibernate 工具 - 无法添加配置 - dom4j 连接超时 -

java - MAVEN 项目未创建

java - 如何使用 IntelliJ 和 Maven 安装库 Deeplearning4j?

java - 线程中的异常 "main"java.lang.ClassFormatError : Absent Code attribute

java - Spring roo实体依赖

java - 从java调用Perl,主要是正则表达式匹配

java - Java 中迭代器因 1 次混淆而关闭

hibernate - 在双向多对一关系中从非所有者方更新实体

java - 如何为 Spring Roo 项目创建 Maven 模块?