首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Maven多模块项目

Maven多模块项目
EN

Stack Overflow用户
提问于 2013-06-30 03:30:00
回答 2查看 2.6K关注 0票数 2

我没有广泛使用Maven

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

现在我们不喜欢的是

  1. 当我们发布子projectA时,我们需要手动修改所有将projectA作为依赖项的项目,以使用新版本。看到Maven有一个版本插件,不确定这会有什么帮助.
  2. 作为一种解决方案,我希望在poms之间有一个更干净的组织,并可能避免上述问题。

我认为( 可能是不正确的 )

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

儿童项目2 pom

代码语言:javascript
复制
  <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 - Error项目构建错误:不可解析的父级POM:未能传输父级:父级:pom:${parent.version}从http://repo1.maven.org/maven2缓存在本地存储库中,在中央更新间隔已过或强制更新之前,不会重新尝试解析。原始错误:无法将工件父级:父级: POM:${parent.version}从/转到中心(http://repo1.maven.org/maven2):索引45处路径中的非法字符:在错误的本地POM处的parent.relativePath和parent.relativePath点

亲本pom

代码语言:javascript
复制
  <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

代码语言:javascript
复制
  <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

代码语言:javascript
复制
public class ParentMain {

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

}

ParentMain -Error

    • 不能将ChildProject1Main解析为类型

    • 不能将ChildProject1Main解析为类型

我目前正在使用Maven版本的 2.2.1 (如果可以使用升级的maven版本来解决这个问题的话),下面的评论之一可以使用“CI工具,比如Jenkins和TeamCity”来解决这个问题。任意指针(示例)如何使用Maven (或Hudson )??解决此问题

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

EN

回答 2

Stack Overflow用户

发布于 2013-06-30 04:09:06

当我看到这个图表时,我想到的第一个问题是,“业务逻辑为什么会对子模块有任何依赖?”有两种想法浮现在我的脑海中,我将逐一分析它们,以及你不该做的事情来重复这些。

  1. 紧密耦合的代码。,这体现在代码复制或大型类/方法气味中。 您希望您的代码是模块化的,这样一个项目只取决于它需要什么才能编译和运行而不会出错。
  2. 非逻辑代码层次结构。(最终)显示为循环依赖关系,或在<exclude>块出现时突然丢失的依赖项。 您需要哪些代码行取决于什么是显式,以便您的代码层次结构得到了很好的布局。

我将以一个基数中的箭头表示一个项目依赖于另一个项目,因此UI和CLI依赖于Business来发挥作用是有意义的。业务逻辑可以依赖子模块来完成与核心无关的其他功能,这也很有意义。

没有意义的是,这些子模型也依赖于Business。子模块应该是唯一的,它们不需要依赖任何来自Business的东西;如果它们依赖,那么也许他们应该住在那里。

至于版本控制,有一些CI工具,比如Jenkins和TeamCity,可以帮助您解决这个问题。其要旨是将其设置成独立于人为干预/错误发生的方式。

票数 1
EN

Stack Overflow用户

发布于 2013-06-30 11:29:56

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

看一看上面的线程。我喜欢Adam的回答,使用版本插件来更新jenkins中的poms中的版本。我同意他的观点,即maven和持续部署是一个特别糟糕的匹配。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17386859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档