Maven,Spring配置多模块项目

时间:2013-03-14 11:13:32

标签: java spring maven

我希望建立一个可以很好地扩展的多模块maven项目(如下所述)。我对这种方法有一些疑问,主要来自Sonatype example

我已经对maven多模块项目进行了一定程度的阅读,但找不到超出基本级别的示例。

问题:

  1. 这(下面)是一个好的项目结构吗?或者从一开始就闻到了灾难的味道 - 即在建立构建时会导致重大的重组吗?简而言之,我希望避免设置与Maven相悖的东西。
  2. 我期待一些模块非常独立,而大多数模块都是相互关联的。是否可以从每个模块开始作为Git仓库,然后重新组合紧密链接的模块?
  3. 目的:

    1. 模块化Spring,JSF2,Maven项目的良好项目结构,允许涉及选择模块及其依赖项的构建。

    2. 应该可以通过Maven配置(如jetty-maven-plugin)在像Tomcat / Jetty这样的轻量级容器上部署单个Web模块。这应该能够通过Maven引入必要的依赖关系。这使得在开发过程中很容易专注于正在处理的模块(不必运行完整的构建和部署),并且只在完整的构建中部署完整的应用程序。

    3. 设置应允许基于要在构建中包含的模块选择的多个分发。我认为这可以通过使用构建模块来实现,这些模块将拉动和打包相应的模块。

    4. 项目结构

      Core domain classes.  
      somapp.core (maven project)  
       |- someapp.core (maven module)  
       |- someapp.core.tests  
      
      Account Management Domain classes   
      someapp.accountmgmt   
      |- someapp.accountmgmt   
      |- someapp.accountmgmt.tests   
      
      component1 domain classes   
      someapp.component1   
      |- someapp.component1   
      |- someapp.component1.tests
      
      Service 1 - # account management (User login)
      someapp.accountmgmt  
       |- someapp.accountmgmt.api  
       |- someapp.accountmgmt.impl  
       |- someapp.accountmgmt.mocks  
       |- someapp.accountmgmt.tests  
      
      someapp.service2  
       |- someapp.service2.api  
       |- someapp.service2.impl  
       |- someapp.service2.mocks   
       |- someapp.service2.tests   
       |- someapp.service2.cli    # CLI access for service2
      
      someapp.service3  
       |- like above  
      
      someapp.accountmgmt.web  
       |- someapp.accountmgmt.web  
      
      someapp.service2.web  
       |- someapp.service2.web  
      
      someapp.service3.web  
       |- someapp.service3.web  
      
      someapp.build1 # bundle accountmgmt and service2 into 1 war file  
      
      someapp.build2 # bundle accountmgmt and service3 into 1 war file  
      
      somapp.build3 # bundle  accountmgmt, service2 and service3 into 1 war file  
      
      (i.e. someapp.accountmgmt.web.war, someapp.accountmgmt.jar, someapp.service2.web.war, someapp.service2.jar, someapp.service3.web.war, someapp.service3.jar, someapp.core.jar)
      

      我理解项目结构不是一成不变的。我想建立一个很好的起点。欢迎提出建议/链接示例。

2 个答案:

答案 0 :(得分:3)

对于春季部分,已经讨论过,Spring Configuration in a multi-module project接受了答案。就一般布局而言,我只看到每个项目和服务只有一个WAR捆绑在一起,如果它们是相关的(例如,UserLoginService不会与DomainObjectsService一起使用)。

我建议将结构分解为几个不同的项目,将依赖项(业务对象等)作为JAR项目部署到本地存储库,并在需要它们的(现在不同的)项目中列为普通的Maven依赖项。然后,在您的应用服务器中,您可以将应用部署到不同的路径(例如yourdomain.com/app1,youdomain.com/service2)。

我对你的抱负表示赞赏!

编辑:如果您愿意,可以使用多种WAR,请参阅有关Using a shared parent application context in a multi-war Spring application的SpringSource博客文章。

答案 1 :(得分:0)

从Spring IO到工件的层次结构可以作为单个构建多模块项目完成。

Spring-IO (dependencies)
   - Your parent pom (custom and further dependency management, plugins etc)
      - someapp-parent (really just a container for each -independent- sub-module)
         someapp-api    (deploy as jar into Nexus
         someapp-remote (Implements API and makes REST calls to your web app - also an independent jar)
         someapp-web    ('war' Exposes REST - JSON - representations of your API domain objects)
         someapp-dashboar (Admin console working with the API/web app via remote so you can manage everything, also a 'war')

Spring IO是BTW非常好的作为一组有福的依赖项,可以很好地协同工作并避免类加载器问题。非常值得迁移您的项目以使用它作为最新版本看起来非常新。我还建议您使用Spring Boot作为您的网络应用程序。

如上所述,我认为将所有与应用程序相关的模块构建为一体是值得的,因此版本控制更容易,您可以在单个构建命令中测试所有内容。我最近在一个项目上工作,我们将所有这些模块分开,它只意味着合并更改,构建工件,部署工件等的4倍。