mvn依赖:树在平凡的项目上失败

我有一个非常复杂的项目(约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> 

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

酒吧/ 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> 

然后,我在顶层目录中发出以下命令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 

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

我很沮丧,为什么它不工作。
一个简单的依赖关系分析只是没有工作。
官方没有任何指导如何做到这一点。
另一个非常有用的命令也没有工作

 mvn dependency:resolve 

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

 mvn test-compile dependency:resolve mvn test-compile dependency:tree 

无论如何,它适用于我


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 

因为我们的项目使用了kotlin,可能是因为kotlin的bug没有跳过汇编,所以我可以把这个bug报告给jetbrains。

好吧,让我们做一个正确的答案,因为评论太短,不能正确的解释。

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

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

  • 第一个叫做父母 。 它通常用于修复依赖和插件版本,以及一些需要级联到子项目的常见配置。 它也有一个有用的属性,因为子项目继承了版本,除非在子项目中明确指定它自己。
  • 第二个角色叫做reactor pom 。 这是主要在<modules>标签中定义的部分。 它定义了一组命令可以作为一个组发送到其他项目(例如: mvn clean install )。 当这个命令被执行的时候,maven会查看在<modules>描述的项目,并且根据它们声明的依赖关系,将确定它们必须用给定的命令调用的顺序,以最大化构建的机会成功。

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

  • mvn dependency:tree将对<modules>标签中列出的所有项目及其自身进行依赖性分析。 这个分析是针对存储库执行的 ,也就是说你的本地.m2仓库以及其他需要的外部仓库。 如果你没有首先在你的仓库中安装你的项目,它会失败,因为它找不到com.example:foo:1.0.0-SNAPSHOT
  • mvn [clean] install ,使用相同的顺序,将执行一个完整的打包和部署你的项目到你的本地仓库。 因为在foo被放入你的仓库之后它会被执行,一切都会好的,每个人都会很高兴。

但那么mvn compile工作呢?

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

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