0

介绍

以下情况:

我正在处理使用 Gradle 构建系统构建的多个依赖 Java 项目。

我想通过 gradle 的 java 平台插件和生成的 BOM(材料清单)来解决几个依赖项。

示例和问题:

在下面的示例中,有一个build.gradle平台 BOM 用作所有项目的依赖关系解析器。此 BOM 中有两个约束:一个用于名为的实现依赖项foo,另一个用于名为 的编译依赖项bar

// build.gradle for BOM "my-utility-bom"
// ...
dependencies {
    constraints {
        api("some.implementation.dependency:foo:3.4.1")
        api("some.compile.dependency:bar:1.2.0")
    }
}
// ...

然后通过将平台关键字应用于给定的 bom 项目,在项目中使用这两个依赖项。因为我想使用来自 bom 的两个约束作为依赖项,所以我implementation在平台项目上使用compileOnly同样的方式。

// build.gradle for java project
//...
dependencies {
    implementation(platform(project(":my-utility-bom")))
    compileOnly(platform(project(":my-utility-bom")))

    implementation("some.implementation.dependency:foo")
    compileOnly("some.compile.dependency:bar")
}

// ...

之后,所有依赖项都作为implementation依赖项和compileOnly依赖项被拉入。但我只想要一个依赖作为implementation依赖,另一个作为compileOnly依赖。

问题

是否可以只提取特定的依赖项implementationcompileOnly依赖项而不使用单独的 BOM 来编译和实现依赖项?

4

1 回答 1

0

我尝试了一个与您类似的示例,并且依赖项按预期得到解决。在你的情况下运行时gradle dependencies

  • 实施配置将仅导入some.implementation.dependency:foo
  • compileOnly 配置将导入some.compile.dependency:bar

那么这将在

  • compileClasspath导入已解析的依赖项some.implementation.dependency:foo:3.4.1some.compile.dependency:bar:1.2.0
  • runtimeClasspath只会导入some.implementation.dependency:foo:3.4.1

我会说你的配置是正确的。如果您的依赖关系树另有说明,那么您的示例中可能还以某种方式应用了依赖项。看看你的实际情况会很有帮助。注意我使用了 Gradle 7.0。在这个存储库中有完整的例子

图帮助我了解如何解决不同的配置

于 2021-05-25T17:26:10.273 回答