Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.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多模块项目时如何避免Java依赖地狱_Java_Maven_Dependencies - Fatal编程技术网

使用Maven多模块项目时如何避免Java依赖地狱

使用Maven多模块项目时如何避免Java依赖地狱,java,maven,dependencies,Java,Maven,Dependencies,几天来,我一直在与Java Maven多模块项目的依赖性作斗争 由于监督太少,开发人员设法创造了一种情况,即每个模块都可以自己编译,但不能作为一个整体一起编译。这会导致各种错误。找不到的类、铸造错误等。这些问题的原因似乎无法确定 我怀疑Maven在类路径上放置了相互冲突的依赖项。我认为我们把Maven的依赖关系搞得一团糟,但不管怎样,我不明白Maven对于多模块项目来说怎么会是一个性能如此差的框架 现在我可以理解,Maven在整体编译多个模块时会尝试做一些非常聪明有用的事情,但是Maven中不应

几天来,我一直在与Java Maven多模块项目的依赖性作斗争

由于监督太少,开发人员设法创造了一种情况,即每个模块都可以自己编译,但不能作为一个整体一起编译。这会导致各种错误。找不到的类、铸造错误等。这些问题的原因似乎无法确定

我怀疑Maven在类路径上放置了相互冲突的依赖项。我认为我们把Maven的依赖关系搞得一团糟,但不管怎样,我不明白Maven对于多模块项目来说怎么会是一个性能如此差的框架

现在我可以理解,Maven在整体编译多个模块时会尝试做一些非常聪明有用的事情,但是Maven中不应该有一个选项,只配置一个模块以与其他模块隔离吗?有这样的选择吗?为了避免这种依赖

或者Maven的最佳实践是创建其他脚本,例如bash脚本,以便能够用一个命令单独编译多个模块

但这也是一个很难解决的问题,一些工具(例如SonarQube)需要能够在整个代码库上运行Maven,以便在SonarQube中创建单个项目

这会导致各种错误。找不到的类、铸造错误等。这些问题的原因似乎无法确定

你能发布错误消息吗?这将使分析您的问题变得更容易。这可能是由依赖冲突引起的,但是如果没有更多的信息,很难说

现在我可以理解,Maven在整体编译多个模块时会尝试做一些非常聪明有用的事情,但是Maven中不应该有一个选项,只配置一个模块以与其他模块隔离吗?有这样的选择吗?为了避免这种依赖

我不明白。如果两个模块互不依赖,则它们的构建将是独立的。如果一个模块依赖于另一个模块,并且它的构建由于版本冲突而失败,那么无论它是与其他模块一起构建还是单独构建,此构建都将失败

或者Maven的最佳实践是创建其他脚本,例如bash脚本,以便能够用一个命令单独编译多个模块

Maven遵循“约定优先于配置”的理念,这意味着遵循约定越多,配置越少,维护工作越少。创建各种各样的脚本违背了这一理念,也不是Maven的最佳实践

要管理多模块项目中的依赖关系冲突,通常需要一个父模块,其pom.xml如下所示

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <packaging>pom</packaging>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-web-api</artifactId>
                <version>6.0</version>
                <scope>provided</scope>
            </dependency>
            ...
        </dependencies>
    </dependencyManagement>

    <modules>
        ...
    </modules>
</project>

4.0.0
...
...
...
聚甲醛
爪哇
javaeewebapi
6
假如
...
...
在DependencyManagement元素中,定义所用库的版本。这样可以强制每个模块使用相同版本的库

对于Maven,我经常推荐JavaEENetBeansIDE,因为除其他外,它有一个很好的依赖关系可视化工具,这在检测和消除版本冲突方面很有用。(我不知道Eclipse或IntelliJ中有类似的工具)。如果在NetBeans中打开Maven项目,请单击pom.xml(在项目窗口中),然后选择Graph>ShowGraph

我用这个工具做两件事:

  • 删除Maven中的可传递依赖项,否则您必须管理比所需更多的依赖项。要删除可传递依赖项,请在图形中单击鼠标右键,然后选择分层布局。不在第一行的每个依赖项都是可传递的依赖项,可以从pom.xml中删除
  • 识别可传递依赖项之间的冲突。(冲突在图中显示为红色。)我通过在根pom.xml中的dependencyManagement元素中显式设置依赖项的版本来解决这些冲突

  • Maven完全可以很好地处理多模块项目。但是,它不能处理具有相同依赖项的不同(不兼容)版本的模块(因为需要多个类加载器才能使其工作)。相反,当存在多个版本时,Maven将采用最新版本的依赖项。双击pom.xml,单击底部的dependency hierarchy选项卡。“dependency hierarchy”显示类似于mvn dependency:tree的输出。它不像NetBeans中的依赖关系图那样直观。虽然Eclipse似乎也存在一个“依赖关系图”,但我只是没有安装它,也从未考虑过如何为Eclipse安装它。