1

我没有广泛使用 Maven

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

在此处输入图像描述

目前我们不喜欢的是

  1. 当我们发布一个子 projectA 时,我们需要手动修改所有具有 projectA 作为依赖项的项目以使用新版本。Saw Maven 有一个版本插件,不知道会有什么帮助。
  2. 作为一种解决方案,我希望在 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 - Error Project build error: Non-resolvable parent POM: Failure to transfer Parent:Parent:pom:${parent.version} from http://repo1.maven.org/maven2被缓存在本地存储库中,解析不会重新尝试,直到经过中央的更新间隔或强制更新。原始错误:无法将工件 Parent:Parent:pom:${parent.version} 从/到中央(http://repo1.maven.org/maven2)传输:索引 45 处路径中的非法字符: http://repo1 .maven.org/maven2/Parent/Parent/ ${parent.version}/Parent-${parent.version}.pom 和 'parent.relativePath' 指向错误的本地 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 版本解决此问题,则可以升级) 下面的评论之一说可以使用“诸如 Jenkins 和 TeamCity 等 CI 工具”来解决这个问题.. 任何指针(示例) 如何使用 Maven ( 和或 Hudson ) 解决这个问题?

我在做什么错,如何为此类项目依赖项获得最佳设计

4

2 回答 2

1

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

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

    您希望您的代码是模块化的,这样一个项目只取决于它需要什么才能编译和运行而不会出错。

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

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

我将在一个基数上使用你的箭头来表示一个项目依赖于另一个,所以 UI 和 CLI 依赖于业务逻辑来运行是有道理的。业务逻辑可以依赖子模块来完成一些与核心不太相关的其他功能也是有道理的。

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

至于版本控制 - 那里有 CI 工具,例如 Jenkins 和 TeamCity,可以帮助您解决这个问题。主旨是以一种独立于人为干预/错误的方式进行设置。

于 2013-06-30T04:09:06.757 回答
0

如何告诉 Maven 使用最新版本的依赖项?

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

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

于 2013-06-30T11:29:56.553 回答