Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven关于依赖项共享的多模块项目组合_Java_Inheritance_Dependencies_Maven 3_Multi Module - Fatal编程技术网

Java Maven关于依赖项共享的多模块项目组合

Java Maven关于依赖项共享的多模块项目组合,java,inheritance,dependencies,maven-3,multi-module,Java,Inheritance,Dependencies,Maven 3,Multi Module,有一些类似的问题,但不是这样的。您如何处理这种情况(典型情况): 一个由8-11个子项目组成的项目,有一个父工件/项目和一个主要项目,主要使用/声明其他子项目作为模块 问题是,所有项目“严格”只共享公共依赖项,如testng、logging、apachecommons等。但是总是喜欢3个使用50-60%相同的特定DEP(apache chemistry、jackrabbit、abdera等),另外2-3个也使用50-60%相同但不同的依赖项。而主服务器使用了很多相同的dep。 我不能将这些“非严

有一些类似的问题,但不是这样的。您如何处理这种情况(典型情况):

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

问题是,所有项目“严格”只共享公共依赖项,如
testng、logging、apachecommons等。但是总是喜欢3个使用50-60%相同的特定DEP(apache chemistry、jackrabbit、abdera等),另外2-3个也使用50-60%相同但不同的依赖项。而主服务器使用了很多相同的dep。

我不能将这些“非严格”共享的DEP放入父项目中,让其他人继承它们。因此,只有公共DEP被继承。而且存在大量重复的依赖项。我只能通过
管理它们的版本

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

我可以有一个以上的家长项目,但它不觉得正确。此外,从父项目继承可能是一场噩梦,因为如果不正确记录/注释父pom定义,您不知道项目需要什么依赖项

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

一个部门负责声明杰克拉比特、阿布德拉、化学

另一个部门声明了htmlcleaner、google api、tika

ThirdPartFact声明
spring、httpclient、selenium

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


我在考虑让我的应用程序开发适应“maven多模块设计”。但如果您想创建只使用各种库的spring服务/bean,在一个模块中,您不会在不同的模块中实现它们,因为它们使用其他模块也使用的库:-)

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

家长

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

4.0.0
美食酒吧
专业父母
0.0.1
聚甲醛
1.2.16
儿童

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

4.0.0
专业父母
美食酒吧
0.0.1
美食酒吧
独生子女
0.0.1-快照
log4j
log4j
${log4j.version}

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

我知道您说过这可能是一场噩梦,但我强烈认为在您的父pom之间继承是一条路要走

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

有些事情会帮助你保持事情的条理和理智

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

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

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


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

我也有同样的问题。我喜欢管理多模块项目,因为它带来的其他优势,但如果项目规模越来越大,这种跨模块依赖项共享将是一场噩梦。可能必须使实际的应用程序开发适应多模块项目设计,并尝试创建这样的组件,这样就不会有任何依赖项重用。。。但这似乎是不对的这根本不是关于版本控制,这是唯一对…有益的事情…我没有版本地狱的问题,不像其他人。。。我在问题中提到,这是我唯一能控制的事情。。。我将属性与DependencyManager结合起来,基于继承的内容和没有的内容。问题是所有这些pom中的依赖项的数量和重复,即使您有控制下的版本,在一个大型项目中维护也是非常困难的。只有一个父目录/pom(从SuperPom继承并聚合所有10个模块)与模块dirs/pom处于同一级别。这些模块继承自父级,它们是父级的模块。不过,我已经按照你的建议做了一切。我相信我必须接受它的现状。我不想把继承和三个子父母联系起来。。。我真的希望所有模块都声明跨多模块的所有重复依赖项project@lisak-你为什么愿意重新申报a