关于依赖关系共享的Maven多模块项目组成

时间:2011-06-14 18:00:32

标签: java inheritance dependencies maven-3 multi-module

有一些类似的问题,但没有这样的问题。你如何应对这种情况(典型情况):

一个8-11个子项目的项目,有一个父工件/项目和一个主要项目,主要使用/声明其他项目为模块。

问题是所有项目“严格”只共享公共依赖项,如testng, logging, apache commons and stuff。但总是喜欢其中3个使用相同特定deps的50-60%(apache-chemistry,jackrabbit,abdera等),另外2-3个也使用50-60%相同但不同的依赖项。主要使用很多相同的代表。

我无法将这些“非严格”共享deps放入父项目中以供其他人继承。所以只有常见的deps才会被继承。并且有大量重复的依赖项。我只能通过<dependencyManagement>来管理他们的版本。

另一个选择是让父pom包含大多数依赖项,但是子项目甚至会继承它们不需要的项。

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

另一种方法是创建仅作为依赖容器的pom工件 - 它们声明特定的依赖关系组,以便模块只声明那些以获得传递依赖关系。但是,嘿,你想部署和提交某种

OneDepArtifact声明jackrabit, abdera, chemistry

AnotherDepArtifact声明htmlcleaner, google-api, tika

ThirdDepArtifact声明spring, httpclient, selenium

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

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

3 个答案:

答案 0 :(得分:3)

Maven 3.1应该通过引入“mixins”来解决这个问题。与此同时,我似乎可以通过正确使用配置文件获得大部分所需功能,正如我在此博客文章中所描述的那样:

http://weblogs.java.net/blog/fabriziogiudici/archive/2011/07/19/maven-pom-composition-means-profiles

请告诉我您是否觉得它有用。

答案 1 :(得分:1)

我知道你说这可能是一场噩梦,但我强烈感觉你的父母之间的继承是可行的。

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

有些事情会帮助你保持整洁有序......

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

希望有了这个建议,父POM文件继承似乎不会那么复杂和噩梦。祝你好运!

答案 2 :(得分:-1)

如果主要是关于版本(数字)控件 - 为什么不在父项目中仅将依赖项版本指定为属性,并在子项目中使用它,例如

<强>父

<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>

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