Maven多模块项目

我没有广泛使用Maven

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

在这里输入图像描述

目前我们不喜欢的东西是

  • 当我们发布一个子项目A时,我们需要手动修改所有具有projectA作为依赖的项目以使用新版本。 看到Maven有一个版本插件,不知道这将如何帮助。
  • 作为一种解决方案,我希望在poms之间建立一个更清洁的组织,并可能避免出现上述问题。
  • 我的想法是(可能不正确)

    在这里输入图像描述

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

    儿童项目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}被缓存在本地存储库中,解析不会重新尝试,直到中央的更新间隔已过或强制更新。 原始错误:无法传输工件父级:父级:pom:$ {parent.version} from / to central(http://repo1.maven.org/maven2):索引45处路径中的非法字符:http:// repo1 .maven.org / maven2 / Parent / Parent / $ {parent.version} /父 - $ {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无法解析为类型
  • 我目前正在使用Maven版本 2.2.1(开放升级,如果这可以使用升级Maven版本解决)下面的一个评论说可以使用“CI工具,如Jenkins和TeamCity”解决这个问题.. 任何指针(示例)如何使用Maven(和/或Hudson)解决这个问题?

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


    当我看到这个图时,我想到的第一个问题是“为什么业务逻辑对子模块有任何依赖关系?” 想到两个想法,我会通过他们每个人,以及你不应该做的重复这些。

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

    你希望你的代码是模块化的 ,这样一个项目只依赖于它需要什么来编译和运行而不会出错。

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

    你需要明确什么取决于什么,以便你的代码层次结构很好地布局。

  • 我将用一个基数来表示一个项目依赖于另一个项目,因此UI和CLI依赖于业务逻辑的功能是有道理的。 这也是有道理的,商业逻辑可以依赖于儿童模块来做一些与核心不相关的其他功能。

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

    至于版本控制 - 那里有CI工具,比如Jenkins和TeamCity,可以帮助你解决这个问题。 推力应该是这样设置,使得它独立于人为干预/错误而发生。


    我如何告诉Maven使用最新版本的依赖关系?

    看看上面的线程。 我喜欢Adam Gent的答案,使用版本插件来更新jenkins中的poms版本。 我同意他的看法,即部署和持续部署是一个特别糟糕的比赛。

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

    链接地址: http://www.djcxy.com/p/37579.html

    上一篇: Maven Multi Module Project

    下一篇: Maven exec:java goal on a multi