在Maven中创建依赖项组以供重用-包括“提供的”依赖项

|| 我是Maven的新手,正在建立我的第一个Maven项目。我还以一些poms的形式创建了一些maven资产,这些pom可以从任何将来的项目中继承或用作依赖项。我想将依赖项分组在一起,并能够根据需要有选择地将它们添加到项目中。 我阅读了有关pom最佳实践的这篇文章。我喜欢将相关的依赖项组合到poms中,然后根据需要将pom作为依赖项添加到项目中的想法。这种方法非常适合编译范围内的依赖项。但是,它对于提供的作用域对象失败,因为作为传递依赖项,它们被忽略了。 这是我的意思的示例:可以说,我将项目的Web依赖项归为一个web-deps pom.xml。其中包括ѭ0范围的spring框架依赖关系,以及include1范围的javaee依赖关系:
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>mvn-web-deps</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>javaee</groupId>
        <artifactId>javaee-api</artifactId>
        <version>${javaee.version}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
然后,我将此pom作为依赖项添加到另一个项目中:
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>project-a</artifactId>
<version>0.0.1-SNAPSHOT</version>

<dependency>
    <groupId>com.xyz</groupId>
    <artifactId>mvn-web-deps</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <type>pom</type>
</dependency>
mvn-web-deps
中的依赖项现在变为可传递的。由于上面的依赖项引用的作用域是“ 0”,因此省略了“ 1”传递依赖项。 我想避免将它们添加到父级的“ 7”部分,因为只能有一个父级,而一个项目可能只需要其中一些依赖项组,而不是全部。我也许可以将它们添加到“ 8”部分,但随后我将不得不在每个子项目中重新声明每个依赖项(不依赖版本)。 在避免上述问题的同时,对依赖项进行分组的正确/更好的方法是什么?     
已邀请:
这个问题的简短答案是,您只应在代码需要编译的地方本地包含“提供的”依赖项,而不能在父pom.xml或其他结构中包含。指示您在全局pom.xml中具有\'provided \'依赖性对于maven而言是无意义的,因为它不需要在此类pom.xml中进行编译。 这是一个很长的答案: 当我开始使用Maven时,我有一个相同的想法,就是尝试将工件和依赖项分组到pom.xml模块中,希望它们将来会有用。现在,我有了更多的经验,我了解到这完全是浪费时间。对我来说,这是过度设计的形式。 我已经学会了将大型项目分成单独的模块,每个模块都在各自的Subversion存储库中。我在其pom.xml中包括了每个本地模块所需的依赖项。我在编写代码时并根据需要(即经过测试且稳定时)发布每个模块的版本标记。 我通过使用自己的pom.xml创建一个单独的maven项目来构建大型项目,并将模块导入为依赖项。发布后,我会不时更新依赖关系中模块的版本。然后,在编译/发布大项目时,我让maven进行拉动,而不是拉动。 Maven允许pom.xmls之间进行各种复杂的构造和层次结构,但是恕我直言,此功能会造成不必要的混乱和复杂性。到目前为止,对我来说,这还没有被证明是真正的好处。一开始,我希望编译一个pom.xml可以以级联的方式正确编译其余部分。我确实得到了一些结果,但是在所有全局pom.xml中都需要维护。 分别发布模块的工件并在这些发行版上构建项目为我节省了很多时间,我只能推荐它。总的来说,我需要维护的pom.xml更少,并且它们的复杂性也更低。对于相同的最终结果... 因此,如果构建全局/结构pom.xml的唯一理由是希望节省时间,那么我建议您放弃这个想法...在单独的项目中分离代码,然后在全球范围内发行和然后进行编译。     
我得出的结论是,Maven不是针对这种用例设计的。我最终有了一个父级
pom.xml
,并将我使用的所有库添加到了
<dependencyManagement>
部分。我创建的所有新项目/模块都从父级
pom.xml
继承其
pom.xml
,并将需要的每个依赖项添加到自己的
<dependencies>
部分中,减去版本。这种方案使我可以在一个地方管理我使用的库的版本及其所需的存储库声明。另一个优点(相对于尝试以某种方式创建依赖项捆绑包)是,这可以对添加到子poms的库进行更细粒度的控制-仅添加实际需要的依赖项。     
提供范围的依赖关系确实是从父POM继承的,但不是从定义为依赖关系的POM继承的,我认为这是Maven的弱点。 鉴于Maven在添加模块作为跨模块层次结构的依存关系方面也有困难,我不能说Maven是管理多模块项目的复杂工具。 Maven期望严格的单根层次结构仅适用于最简单的项目。     

要回复问题请先登录注册