首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有关依赖项共享的Maven多模块项目组合

有关依赖项共享的Maven多模块项目组合
EN

Stack Overflow用户
提问于 2011-06-14 18:00:32
回答 3查看 4K关注 0票数 5

有几个类似的问题,但没有像这样。如何处理这种情况(典型场景):

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

问题是,所有项目“严格地”只共享公共依赖项,比如testng, logging, apache commons and stuff。但与3一样,它们中的3种使用50%-60%相同的特定deps (apache-化学、野兔、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多模块设计“。但是,如果您想创建spring服务/bean,只使用不同的库,在一个模块中,您不会在不同的模块中实现它们,仅仅是因为它们使用的是库,而其他模块也使用:-)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-19 17:57:29

Maven 3.1应该通过引入"mixins“来解决这个问题。与此同时,我似乎可以通过适当使用概要文件获得大多数所需的特性,正如我在这篇博客文章中所描述的那样:

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

请让我知道你是否觉得它有用。

票数 3
EN

Stack Overflow用户

发布于 2011-06-14 21:59:21

我知道你说过这可能是一场噩梦,但我强烈认为继承父母的遗产是可行的。

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

有些东西能帮你保持组织和理智..。

  • 使用好的命名约定;不要只调用父项目parent1parent2。使用名称来描述他们配置的依赖项和其他东西,这样人们就可以直观地知道什么时候使用哪种。
  • 使用maven的发布/部署特性,以便在回购中正确地对这些版本进行版本化,并始终引用固定版本工件。不使用快照是具有确定性的、可复制的构建的第一步。当事情动态变化时,调试问题是非常困难的。
  • 不要依赖pom.xml文件来了解项目所需的依赖项。这将导致您避免继承和其他事情,如自定义配置文件。您应该使用maven-依赖-插件来执行这些分析任务。有一些命令,如mvn dependency:tree,显示了项目的所有依赖项,mvn dependency:analyze命令显示了未使用的依赖项。

希望有了这个建议,父POM文件继承不会显得那么复杂和可怕。祝好运!

票数 3
EN

Stack Overflow用户

发布于 2011-06-14 19:50:19

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

亲本

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

儿童

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

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

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

https://stackoverflow.com/questions/6347913

复制
相关文章

相似问题

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