Gradle java-平台插件和平台定义
Gradle java-platform plugin and platform definition
我正在尝试使用 java-platform
插件在多模块项目中共享依赖约束。我想做的是设置一个名为 platform
的模块,我可以在其他模块中使用 platform(project(":platform"))
导入它。此外,我想使用 platform("group-id:of-the-bom:and-version")
.
将 BOM 导入到我的平台项目中
一个例子是下面的结构:
// settings.gradle
include("platform")
include("consumer")
// platform/build.gradle
apply plugin: 'java-platform'
repositories {
mavenCentral()
}
dependencies {
constraints {
api platform("org.wildfly.bom:wildfly-javaee8:15.0.1.Final")
}
}
// consumer/build.gradle
apply plugin: 'java-library'
repositories {
mavenCentral()
}
dependencies {
implementation platform(project(":platform"))
implementation "org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec"
}
当我 运行 gradle consumer:dependencies
我得到包含以下内容的输出:
compileClasspath - Compile classpath for source set 'main'.
+--- project :platform
\--- org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec FAILED
似乎 platform
模块不是 "re-exporting" 通过使用 platform()
.
引入的约束
我发现了两个 "workarounds",它们并没有真正解决我的问题,但似乎表明问题是 platform()
与 java-platform
插件一起使用:
- 将
implementation platform(project(":platform"))
替换为 consumer/build.gradle
中的 implementation platform("org.wildfly.bom:wildfly-javaee8:15.0.1.Final")
。
- 在
platform/build.gradle
中放置一个显式条目,例如 api org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec:1.0.1.Final
。
java-platform
插件是否不适合以这种方式使用,还是我缺少某些配置选项?
在 Gradle 中导入 BOM 意味着您要 依赖 BOM 以应用其提供的 约束。
您默认添加到平台的是约束。但是只有当且仅当存在匹配的 dependency 声明时,约束才会出现在图中。此外,约束 仅 告知目标模块。他们从不带来任何传递信息。
所以您需要做的是在 BOM 上声明您的 platform
项目 依赖于 。然后它将按预期导出其约束。
// platform/build.gradle
apply plugin: 'java-platform'
repositories {
mavenCentral()
}
javaPlatform {
// Declare that your platform contains dependencies
allowDependencies()
}
dependencies {
// This is a dependency on the BOM that will bring its constraints transitively
api platform("org.wildfly.bom:wildfly-javaee8:15.0.1.Final")
constraints {
// Additional constraints not covered by the platform above go here
}
}
我正在尝试使用 java-platform
插件在多模块项目中共享依赖约束。我想做的是设置一个名为 platform
的模块,我可以在其他模块中使用 platform(project(":platform"))
导入它。此外,我想使用 platform("group-id:of-the-bom:and-version")
.
一个例子是下面的结构:
// settings.gradle
include("platform")
include("consumer")
// platform/build.gradle
apply plugin: 'java-platform'
repositories {
mavenCentral()
}
dependencies {
constraints {
api platform("org.wildfly.bom:wildfly-javaee8:15.0.1.Final")
}
}
// consumer/build.gradle
apply plugin: 'java-library'
repositories {
mavenCentral()
}
dependencies {
implementation platform(project(":platform"))
implementation "org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec"
}
当我 运行 gradle consumer:dependencies
我得到包含以下内容的输出:
compileClasspath - Compile classpath for source set 'main'.
+--- project :platform
\--- org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec FAILED
似乎 platform
模块不是 "re-exporting" 通过使用 platform()
.
我发现了两个 "workarounds",它们并没有真正解决我的问题,但似乎表明问题是 platform()
与 java-platform
插件一起使用:
- 将
implementation platform(project(":platform"))
替换为consumer/build.gradle
中的implementation platform("org.wildfly.bom:wildfly-javaee8:15.0.1.Final")
。 - 在
platform/build.gradle
中放置一个显式条目,例如api org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec:1.0.1.Final
。
java-platform
插件是否不适合以这种方式使用,还是我缺少某些配置选项?
在 Gradle 中导入 BOM 意味着您要 依赖 BOM 以应用其提供的 约束。
您默认添加到平台的是约束。但是只有当且仅当存在匹配的 dependency 声明时,约束才会出现在图中。此外,约束 仅 告知目标模块。他们从不带来任何传递信息。
所以您需要做的是在 BOM 上声明您的 platform
项目 依赖于 。然后它将按预期导出其约束。
// platform/build.gradle
apply plugin: 'java-platform'
repositories {
mavenCentral()
}
javaPlatform {
// Declare that your platform contains dependencies
allowDependencies()
}
dependencies {
// This is a dependency on the BOM that will bring its constraints transitively
api platform("org.wildfly.bom:wildfly-javaee8:15.0.1.Final")
constraints {
// Additional constraints not covered by the platform above go here
}
}