Maven多模块项目

时间:2013-06-30 03:30:01

标签: maven multi-module

我没有广泛使用过Maven

目前有5个不同的maven项目,每个项目都有不同的pom.xml。截至目前,它们之间存在依赖关系,每个都指向<依赖>如果需要的话。

enter image description here

目前我们不喜欢的是

  1. 当我们发布子项目A时,我们需要手动修改所有具有projectA的项目作为使用新版本的依赖项。 Saw Maven有一个版本插件,不确定它会有什么帮助。
  2. 作为一种解决方案,我希望在poms之间建立一个更清洁的组织,并避免出现上述问题。
  3. 我的想法是什么(可能不正确

    enter image description here

    胖箭头表示父子关系,细箭头表示子模块。但这似乎不起作用,请参阅下面的代码和错误

    儿童项目2 pom

      <groupId>ChildProject2</groupId>
      <artifactId>ChildProject2</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <parent>
         <groupId>Parent</groupId>
         <artifactId>Parent</artifactId>
         <version>${parent.version}</version>
         <relativePath>../Parent/pom.xml</relativePath>
      </parent>
      <dependencies> ...   </dependencies>
    

    ChildProject2 - 错误 项目构建错误:不可解析的父POM:未能转移父级:父级:pom:来自http://repo1.maven.org/maven2的$ {parent.version}  缓存在本地存储库中,在中心的更新间隔过去或强制更新之前,不会重新尝试解析。原始错误:  无法传输工件Parent:Parent:pom:$ {parent.version} from / to central(http://repo1.maven.org/maven2):索引45处路径中的非法字符:  http://repo1.maven.org/maven2/Parent/Parent/ $ {parent.version} / Parent - $ {parent.version} .pom和'parent.relativePath'指向错误的本地POM

    家长pom

      <groupId>Parent</groupId>
      <artifactId>Parent</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
    
      <properties>
       <parent.version>0.0.1-SNAPSHOT</parent.version>
      </properties>
    
      <modules>
        <module>../ChildProject2</module>
        <module>../ChildProject1</module>
      </modules>
    
      <dependencies> ...  </dependencies>
    

    GrandParent2 pom

      <groupId>GrandParent2</groupId>
      <artifactId>GrandParent2</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
    
      <properties>
       <grandparent2.version>0.0.1-SNAPSHOT</grandparent2.version>
      </properties>
    
      <modules>
        <module>../Parent</module>
      </modules>
    
      <dependencies>...  </dependencies>
    

    ParentMain.java

    public class ParentMain {
    
        public static void main(String[] args) {
            DocumentFactory df = new DocumentFactory();
            ChildProject1Main cp1 = new ChildProject1Main();
            ChildProject2Main cp2 = new ChildProject2Main();
        }
    
    }
    

    ParentMain - 错误

      • ChildProject1Main无法解析为类型
      • ChildProject1Main无法解析为类型
    1. 我目前正在使用 Maven版本 2.2.1(如果可以使用已升级的maven版本解决此问题,则可以升级) 下面的一条评论说可以使用“Jenkins和TeamCity等CI工具”解决这个问题。 任何指针(示例)如何使用Maven(和或Hudson)解决这个问题?吗

      我做错了什么,如何为这样的项目依赖项获得最佳设计

2 个答案:

答案 0 :(得分:1)

当我看到这个图时,我想到的第一个问题是,“为什么业务逻辑对子模块有任何依赖性?”我想到了两个想法,我会仔细阅读每一个想法以及你不应该做些什么来重复这些想法。

  1. 紧密耦合的代码。这表现在代码重复或大类/方法的气味。

    您希望您的代码模块化,这样项目只需依赖于它所需的内容,以便编译和运行而不会出错。

  2. 不合逻辑的代码层次结构。这(最终)表现为循环依赖关系,或者当<exclude>块出现时突然丢失的依赖关系。

    您需要的内容取决于显式的内容,以便您的代码层次结构布局合理。

  3. 我将把你的箭头放在一个基数上,意味着项目依赖于另一个,所以UI和CLI依赖于业务逻辑来运行是有意义的。有意义的是,Business Logic可以依赖于子模块来完成与核心不太相关的其他功能。

    有意义的是这些儿童模型还依赖于商业逻辑。子模块应该足够独特,不需要依赖Business Logic的任何东西;如果他们这样做,那么也许他们应该住在那里。

    至于版本控制 - 有一些CI工具,例如Jenkins和TeamCity可以帮助你解决这个问题。我们的目标是建立一种独立于人为干预/错误的方式。

答案 1 :(得分:0)

How do I tell Maven to use the latest version of a dependency?

看一下上面的帖子。我喜欢Adam Gent使用版本插件在jenkins中更新poms版本的答案。我同意他认为maven和持续部署是一个特别糟糕的比赛。

因此,对于任何共享配置(插件,依赖项等)使用它和一个简单的父pom,但不要使它们成为多模块项目和版本,并将父pom作为独立的东西释放。