mvn依赖:树在普通项目上失败

Feu*_*mel 7 maven maven-dependency-plugin

我有一个非常复杂的项目(大约100个模块),我想在其上运行mvn dependency:tree.它失败了,抱怨无法解决的依赖关系.否则该项目编制正常.所以我创建了我可以提出的最基本的项目,它仍然失败并出现同样的错误.显然要么我必须做一些非常基本的错误,或者maven-dependency-plugin还没有被任何人使用过.以下是测试项目的三个POM:

pom.xml中:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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>com.example</groupId>
    <artifactId>root</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>foo</module>
        <module>bar</module>
    </modules>
</project>
Run Code Online (Sandbox Code Playgroud)

富/ pom.xml中:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
</project>
Run Code Online (Sandbox Code Playgroud)

酒吧/ pom.xml中:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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>com.example</groupId>
    <artifactId>bar</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>foo</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

然后我mvn dependency:tree在顶级目录中发出以下命令并获得以下输出:

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] foo
[INFO] bar
[INFO] root
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building foo 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ foo ---
[INFO] com.example:foo:jar:1.0.0-SNAPSHOT
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building bar 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] foo ................................................ SUCCESS [  0.756 s]
[INFO] bar ................................................ FAILURE [  0.011 s]
[INFO] root ............................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.065 s
[INFO] Finished at: 2015-03-03T16:19:18+01:00
[INFO] Final Memory: 13M/309M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project bar: Could not resolve dependencies for project com.example:bar:jar:1.0.0-SNAPSHOT: Could not find artifact com.example:foo:jar:1.0.0-SNAPSHOT -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :bar
Run Code Online (Sandbox Code Playgroud)

我错过了什么?这不应该工作吗?

Wil*_*ung 11

我很沮丧为什么它不起作用.
简单的依赖性分析不起作用.
官方没有任何指导如何做到这一点.
另一个非常有用的命令也不起作用

mvn dependency:resolve
Run Code Online (Sandbox Code Playgroud)

但是,也许你可以试试这些命令

mvn test-compile dependency:resolve
mvn test-compile dependency:tree
Run Code Online (Sandbox Code Playgroud)

无论如何,它对我有用


2017年3月13日更新

我们可以通过跳过编译来使速度更快

 mvn test-compile dependency:resolve -Dmaven.main.skip=true -Dmaven.test.skip=true
 mvn test-compile dependency:tree    -Dmaven.main.skip=true -Dmaven.test.skip=true
Run Code Online (Sandbox Code Playgroud)

很遗憾它对我们的项目不起作用,因为我们的项目是使用kotlin,也许是kotlin的bug没有跳过编译,也许我应该把这个bug报告给jetbrains.


giz*_*zmo 7

好吧,让我们做出正确的答案,因为评论太短了,无法正确解释。

Maven 是一个具有各种组合方面的工具,有时很难确定哪些部分对给定命令起作用。

在你的榜样,你有两个经典项目,foobar和一个特殊的一个,root
root在它扮演的意义上是特殊的,在你的例子中,它扮演着两个角色。

  • 第一个称为父 pom。它通常用于修复依赖项和插件版本,以及一些需要级联到子项目的常见配置。它还有一个有时有用的属性,因为除非在子项目中明确指定,否则子项目会继承该版本。
  • 第二个角色称为反应堆 pom。这是<modules>标签中主要定义的部分。它定义了一组其他项目,命令可以作为一个组发送到这些项目(例如:)mvn clean install。执行此类命令时,maven 将查看 中描述的项目,<modules>并根据它们声明的依赖项,确定它们必须使用给定命令调用的顺序,以最大限度地提高构建成功的机会。

现在,关于您尝试过的各种命令的行为(假设它们都在root项目中被调用:

  • mvn dependency:tree将对<modules>标签中列出的所有项目加上自身进行依赖分析。此分析是针对存储库执行的,这意味着您的本地 .m2 存储库和其他需要时的外部存储库。如果您没有先在您的存储库中安装您的项目,它将失败,bar因为它com.example:foo:1.0.0-SNAPSHOT在那里找不到。
  • mvn [clean] install使用相同的顺序,将您的项目完整打包并部署到您的本地存储库中。作为bar后会被执行foo已投入你的资料库,都将被罚款,大家会很高兴。

但是那行得通mvn compile呢?

嗯,你的情况有点棘手。由于您的示例没有要编译的实际代码,因此会跳过编译的依赖项解析,因此在您的foo工件尚不可用时不会发生错误。

现在,你关于分支,并在你的回购...文物的话
当你切换到一个分支,除非所有其他项目(模块)使用的稳定版本号(即没有快照后缀),你应该执行mvn [clean] install上运行reactor pom 以确保您开始使用一组连贯的模块和依赖项。
与解释型语言相比,您可能认为这是浪费时间,但这是处理项目的 MAVEN 方式。它确保您的所有模块在您开始工作之前都已对齐。