Java 平台插件不使用所有依赖项 介绍示例和问题:问题

问题描述

介绍

以下情况:

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

我想通过 gradle 的 java 平台插件和由此产生的 BOM(物料清单)解决几个依赖项。

示例和问题:

在下面的示例中,平台 BOM 有一个 build.gradle,用作所有项目的依赖项解析器。此 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")
    }
}
// ...

然后通过将 platform 关键字应用于给定的 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 来进行编译和实现依赖项?

解决方法

我尝试了一个与您类似的示例,并且依赖项已按预期解决。 在您运行 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。在此存储库中 there is whole example

graph helped 我了解如何解决不同的配置

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...