2011-06-14 159 views
5

有几个类似的问题,但没有像这样。如何处理这种情况(典型场景):有关依赖关系共享的Maven多模块项目组合

8-11个子项目的项目,有一个父项目/项目和一个主要项目,主要使用/将这些项目声明为模块。

问题是,所有项目“严格”只共享共同的依赖项,如testng, logging, apache commons and stuff。但总是像其中3人使用50-60%的相同特定折扣(apache-chemistry,jackrabbit,abdera等),另外2-3人也使用50-60%的相同但不同的依赖关系。主要的使用了许多相同的代价。

我不能将这些“非严格”共享deps放入父项目中以供其他人继承它们。所以只有共同的代价才被继承。并且有大量重复的依赖关系。我只能通过<dependencyManagement>管理他们的版本。

另一种选择是父pom包含大部分依赖关系,但子项目甚至会继承那些他们不需要的项目。

我可以有超过1个父项目,但它感觉不对。父项目的继承也可能是噩梦,因为如果你没有正确地记录/评论父项目定义,你不知道项目需要什么依赖项。

另一种方法是创建仅用作依赖容器的pom构件 - 它们声明特定的依赖关系组,以便模块声明这些构件以获得传递性依赖关系。但是,嘿,你想部署,并承诺某种

OneDepArtifact声明jackrabit, abdera, chemistry

AnotherDepArtifact声明htmlcleaner, google-api, tika

ThirdDepArtifact声明spring, httpclient, selenium

这是一个巨大的混乱,我不知道如果我正确使用<dependencyManagement>,它似乎只对管理依赖项版本有用。

我在考虑将我的应用程序开发调整为“maven multimodule design”。但是如果你想创建弹簧服务/ bean,只使用不同的库,在一个模块中,你不会在不同的模块中实现它们,只是因为它们使用库,其他模块也使用:-)

+0

我有完全相同的问题。我喜欢管理多模块项目,因为它带来了其他优势,但如果项目变大,这种跨模块依赖关系共享是一场噩梦。 – lisak 2011-06-14 18:15:04

+0

也许人们必须调整实际的应用程序开发到多模块项目设计,并尝试创建这样的组件,以便不会有任何依赖重用......但这似乎并不正确 – lisak 2011-06-14 18:31:54

回答

0

如果它的主要讲述的版本(数量)控制 - 为什么不在父项目仅指定的依赖版本属性,并使用它在儿童项目,如

家长

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>foo.bar</groupId> 
    <artifactId>maven-parent</artifactId> 
    <version>0.0.1</version> 
    <packaging>pom</packaging> 

    <properties> 
     <log4j.version>1.2.16</log4j.version> 
    </properties> 

</project> 

儿童

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <artifactId>maven-parent</artifactId> 
     <groupId>foo.bar</groupId> 
     <version>0.0.1</version> 
    </parent> 

    <groupId>foo.bar</groupId> 
    <artifactId>maven-child</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 
    </dependencies> 

</project> 

这是一个简单的解决方案,可让您使用一致的版本号指定特定的项目依赖关系。

+0

这不是关于版本控制,这只是的好处......我没有版本问题,不像其他人......我在问题中提到过,这只是我控制的东西...我把属性和dependencyManagement结合起来,基于什么是继承和什么不是 – lisak 2011-06-14 19:59:42

+0

问题是所有这些poms中依赖关系的数量和重复,即使你的版本在控制之下,它仍然很难保持在一个大的项目 – lisak 2011-06-14 20:03:57

1

我知道你说这可能是一场噩梦,但我强烈地感觉到你父母之间的遗传就是要走的路。

我在this answer中描述了一个很好的多模块项目结构。它还描述了使用聚合器和父链式继承。

一些东西,这将帮助你使事情变得有组织,有理智...

  • 使用良好的命名约定;不要致电父母项目parent1parent2。使用名称来描述他们配置什么样的依赖关系和其他东西,因此人们很直观地知道在什么时候使用。
  • 使用maven的发布/部署功能,以便它们在您的回购中正确版本化并始终引用固定版本工件。不使用SNAPSHOT是确定性,可重复构建的第一步。在事情变化时调试问题非常困难。
  • 不要依赖pom.xml文件来知道项目需要什么依赖关系。这将导致您避免继承和其他事情,如自定义配置文件。您应该使用maven-dependency-plugin来执行这些分析任务。有像mvn dependency:tree这样的命令向您显示项目的所有依赖关系,并显示您未使用的依赖关系的mvn dependency:analyze

希望通过这个建议,父POM文件继承看起来不会那么复杂和噩梦。祝你好运!

+0

我只在同一级别有一个父目录/ pom(继承SuperPom并聚合所有10个模块)和模块目录/ pom。模块继承自父类,它们是它的模块。不过,我已经按照你的建议去做了。我相信我必须接受它。我不希望链接继承与3个子父母......我真的希望所有的模块声明所有这些重复的依赖关系在多模块项目 – lisak 2011-06-14 22:15:55

+0

@lisak - 你为什么喜欢重新声明所有的重复依赖关系,而不是使用继承?此外,你应该尝试让你的父母不同于聚合器的POM。根据我的经验,这总能让事情变得更轻松。我在链接到的答案中描述了这种布局。 – 2011-06-15 14:49:15

+0

如果共享依赖是构成模块兄弟的唯一方面,那么链式继承就是多余的。如果还有一些插件或构建阶段的东西要继承,为什么不呢。但除此之外,我发现它更容易处理。另外,很难跟踪在依赖关系中列出的Unused声明的运行时/测试依赖项:analyze ...只是我不在乎我是否使用它,也许这是主要问题,在这种情况下,此功能的存在并没有给我带来任何救济:-) – lisak 2011-06-15 16:27:08