首页 > 解决方案 > maven如何寻找传递依赖

问题描述

我有一个 gradle 项目A,我想将其导出为库,现在我使用 maven 发布插件从其生成 pom.xml build.gradle。并成功上传到本地神器。

现在我可以将它导入另一个项目,但不考虑依赖项。

例如:我的库A有依赖项BC. 当我A在项目中使用时,它不会下载BC.

我假设我在生成时做错了A(不正确pom.xml/或任何其他错误)。

但我想知道,Maven 是如何计算传递依赖的。比如,它扫描哪些文件/位置,它在哪里寻找依赖关系?

代码

pom.xml在项目中生成的任务A

task writeNewPom << {
    pom {
        project {
            groupId 'com.a.b'
            version '1.0.0'
        }
    }.writeTo("src/main/resources/META-INF/maven/com.a.b/feature-store-lib/pom.xml")
}

我的 pom.xml 的位置在META-INF/maven/com.a.b/feature-store-lib/

我成功地能够在神器中上传。

我也可以在另一个 gradle 项目中正确导入,但是它的传递依赖项丢失了。

这是裁剪后的输出gradle dependencies

|    |    \--- org.junit.platform:junit-platform-commons:1.3.1 (*)
|    \--- junit:junit:4.12
|         \--- org.hamcrest:hamcrest-core:1.3
+--- com.a.b:feature-store-lib:0.4
+--- io.github.microutils:kotlin-logging:1.6.22
|    +--- io.github.microutils:kotlin-logging-common:1.6.22

如您所见,没有来自 com.a.b:feature-store-lib:0.4

需要想法来调试。

标签: javamavengradle

解决方案


首先,由于一些外部要求,我将假设您以这种方式生产 pom。否则我会建议使用文档中描述的发布插件。以这种方式发布到工件变得非常容易。

我的第一直觉是你可能在你的依赖声明中使用了错误的配置。如果您使用的是较新版本的 gradle,您应该使用api配置来处理需要向您的工件的任何用户公开的依赖项。

dependencies {
    api 'org.apache.httpcomponents:httpclient:4.5.7' // Exposed
    implementation 'org.apache.commons:commons-lang3:3.5' // Not exposed
}

有关更多信息,请参阅有关此主题的 gradle 文档:https ://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_configurations_graph


推荐阅读