Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.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
maven循环依赖关系+;继承最佳实践_Maven_Dependency Management - Fatal编程技术网

maven循环依赖关系+;继承最佳实践

maven循环依赖关系+;继承最佳实践,maven,dependency-management,Maven,Dependency Management,我有以下几个项目结构:项目a、B、C 它们都在父项目D下。在pom.xml的D文件夹下: <module>A</module> <module>B</module> <module>C</module> 其中大多数是可传递的依赖项,而不是我的项目直接需要的依赖项。将它们作为依赖项放在父D的pom.xml中,让子项目(A、B、C)从D继承它们,这有意义吗?我注意到,如果您这样做,mvn dependency:tree将给您类

我有以下几个项目结构:项目a、B、C

它们都在父项目D下。在pom.xml的D文件夹下:

<module>A</module>
<module>B</module>
<module>C</module>
其中大多数是可传递的依赖项,而不是我的项目直接需要的依赖项。将它们作为依赖项放在父D的pom.xml中,让子项目(A、B、C)从D继承它们,这有意义吗?我注意到,如果您这样做,mvn dependency:tree将给您类似的警告

[WARNING] Unused declared dependencies found: log4j, slf4j ....
如果这给了我警告,我想这是maven不建议你做的事情

  • 最重要的是:只声明模块直接需要的依赖项。在不了解更多模块及其依赖关系的情况下,很难提出任何具体的建议。在您的案例中,常见依赖项的示例是什么?也许重组模块有助于减少常见的依赖关系。根据您的项目,将模块A、B和C中依赖于同一工件的所有类放入新模块E中可能是合理的
  • 在我看来,不应该在父pom的dependencies部分中放入任何内容(看到警告,maven似乎也有同感;-)。至少将多个模块中使用的依赖项的所有版本放入父模块的依赖项管理部分。这有助于在整个项目中始终保持特定依赖项的同一版本
  • 如图2所示。您应该只在父级的依赖项管理部分中指定这些工件的版本,并在需要它的每个模块中重复它们,而不指定版本。如表1所述。您应该只指定直接依赖项。例如,如果您使用的是slf4j,那么在包含主类的模块中应该只需要log4j
  • 总而言之:

    • 只声明模块的直接依赖项,可传递依赖项由maven自动处理(这是使用maven的主要原因之一)
    • 仅声明所需的依赖项:例如,在slf4j的情况下,您只需要一个依赖于
      slf4j-log4j12
      的模块,所有其他模块只需要依赖于slf4j api
    • 在父pom中定义版本,以便所有子模块使用相同的版本。在
      dependencyManagement
      部分执行以下操作:
      
      org.slf4j
      slf4j api
      1.6.4
      

    • 对于每个模块,在模块pom中指定所有直接依赖项,但不指定如下版本:
      
      org.slf4j
      slf4j api
      

    要处理由许多模块共享的许多依赖项,您还可以使用以下方法:创建一个新的“依赖项收集模块”(我们称之为
    X
    ),它除了依赖于每个所需的工件之外,什么都不做。现在,每个模块只需要依赖于
    X
    即可自动依赖于其依赖项。但我不推荐这种方法,因为(除其他原因外)现在每个模块都依赖于
    X
    中的依赖项,如果从
    X
    中删除依赖项,您无法确定会发生什么,您需要查看多个pom才能找到模块直接依赖项

    希望这有点帮助:-)

  • 最重要的是:只声明模块直接需要的依赖项。在不了解更多模块及其依赖关系的情况下,很难提出任何具体的建议。在您的案例中,常见依赖项的示例是什么?也许重组模块有助于减少常见的依赖关系。根据您的项目,将模块A、B和C中依赖于同一工件的所有类放入新模块E中可能是合理的
  • 在我看来,不应该在父pom的dependencies部分中放入任何内容(看到警告,maven似乎也有同感;-)。至少将多个模块中使用的依赖项的所有版本放入父模块的依赖项管理部分。这有助于在整个项目中始终保持特定依赖项的同一版本
  • 如图2所示。您应该只在父级的依赖项管理部分中指定这些工件的版本,并在需要它的每个模块中重复它们,而不指定版本。如表1所述。您应该只指定直接依赖项。例如,如果您使用的是slf4j,那么在包含主类的模块中应该只需要log4j
  • 总而言之:

    • 只声明模块的直接依赖项,可传递依赖项由maven自动处理(这是使用maven的主要原因之一)
    • 仅声明所需的依赖项:例如,在slf4j的情况下,您只需要一个依赖于
      slf4j-log4j12
      的模块,所有其他模块只需要依赖于slf4j api
    • 在父pom中定义版本,以便所有子模块使用相同的版本。在
      dependencyManagement
      部分执行以下操作:
      
      org.slf4j
      slf4j api
      1.6.4
      

    • 对于每个模块,在模块pom中指定所有直接依赖项,但不指定如下版本:
      
      org.slf4j
      slf4j api
      

    要处理由许多模块共享的许多依赖项,您还可以使用以下方法:创建一个新的“依赖项收集模块”(我们称之为
    X
    ),它除了依赖于每个所需的工件之外,什么都不做。现在,每个模块只需要依赖于
    X
    即可自动依赖于其依赖项。但我不推荐这种方法,因为(除其他原因外)现在每个模块都依赖于
    X
    中的依赖项,如果从
    X
    中删除依赖项,您无法确定会发生什么,您需要查看多个pom才能找到模块直接依赖项

    呵呵
    [WARNING] Unused declared dependencies found: log4j, slf4j ....
    
    <dependencyManagement> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.4</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> </dependencies>