mvn dependency:tree 在琐碎的项目上失败
mvn dependency:tree fails on trivial project
我有一个非常复杂的项目(大约 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>
foo/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>
bar/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
我错过了什么?这不应该有用吗?
好的,让我们做出正确的回答,因为评论有点太短,无法正确解释。
Maven 是一个包含各种组合方面的工具,有时很难确定哪些部分对给定命令起作用。
在您的示例中,您有两个 经典 项目,foo
和 bar
以及一个特殊项目,root
.
root
在它扮演的意义上是特殊的,在你的例子中有两个角色。
- 第一个叫做parent pom。通常用于修复依赖和插件版本,以及一些需要级联到子项目的常用配置。它还有一个有时有用的 属性,因为子项目继承版本,除非在子项目本身中明确指定。
- 第二个角色叫做reactor 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
工件尚不可用时,不会发生任何错误。
现在,关于您对存储库中的分支和工件的评论...
当你切换到一个分支时,除非所有其他项目(模块)都使用稳定版本号(即没有 SNAPSHOT 后缀),你 should 执行 mvn [clean] install
运行 在你的 reactor pom 上,以确保你开始使用一组连贯的模块和依赖项。
与例如,相比,您可能认为这是浪费时间。解释性语言,但它是 MAVEN 方式 来处理项目。它确保在您开始工作之前所有模块都对齐。
我很沮丧为什么它不起作用。
一个简单的依赖分析是行不通的。
而且官方也没有任何指导如何去做。
另一个非常有用的命令也没有用
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 的错误没有跳过编译,也许我应该向 jetbrains 报告这个错误。
我有以下错误:java.lang.NoClassDefFoundError: org/sonatype/aether/*
,但我使用旧插件解决了问题,正如错误日志中 official page 所指出的那样:
mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:tree
对我来说 none 这些都奏效了。我的 maven-enforcer-plugin
依赖版本设置为 3.0.0
,但将其更改为 3.0.0-M3
对我有用。
我有一个非常复杂的项目(大约 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>
foo/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>
bar/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
我错过了什么?这不应该有用吗?
好的,让我们做出正确的回答,因为评论有点太短,无法正确解释。
Maven 是一个包含各种组合方面的工具,有时很难确定哪些部分对给定命令起作用。
在您的示例中,您有两个 经典 项目,foo
和 bar
以及一个特殊项目,root
.
root
在它扮演的意义上是特殊的,在你的例子中有两个角色。
- 第一个叫做parent pom。通常用于修复依赖和插件版本,以及一些需要级联到子项目的常用配置。它还有一个有时有用的 属性,因为子项目继承版本,除非在子项目本身中明确指定。
- 第二个角色叫做reactor 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
工件尚不可用时,不会发生任何错误。
现在,关于您对存储库中的分支和工件的评论...
当你切换到一个分支时,除非所有其他项目(模块)都使用稳定版本号(即没有 SNAPSHOT 后缀),你 should 执行 mvn [clean] install
运行 在你的 reactor pom 上,以确保你开始使用一组连贯的模块和依赖项。
与例如,相比,您可能认为这是浪费时间。解释性语言,但它是 MAVEN 方式 来处理项目。它确保在您开始工作之前所有模块都对齐。
我很沮丧为什么它不起作用。
一个简单的依赖分析是行不通的。
而且官方也没有任何指导如何去做。
另一个非常有用的命令也没有用
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 的错误没有跳过编译,也许我应该向 jetbrains 报告这个错误。
我有以下错误:java.lang.NoClassDefFoundError: org/sonatype/aether/*
,但我使用旧插件解决了问题,正如错误日志中 official page 所指出的那样:
mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:tree
对我来说 none 这些都奏效了。我的 maven-enforcer-plugin
依赖版本设置为 3.0.0
,但将其更改为 3.0.0-M3
对我有用。