我正在尝试使用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
模块不是“重新导出”约束,这些约束是通过使用platform()
引入的。我发现了两个“变通办法”,它们不能真正解决我的问题,但似乎表明问题在于
platform()
和java-platform
插件的使用:implementation platform(project(":platform"))
替换为implementation platform("org.wildfly.bom:wildfly-javaee8:15.0.1.Final")
中的consumer/build.gradle
。 platform/build.gradle
中放置一个显式条目,例如api org.jboss.spec.javax.ejb:jboss-ejb-api_3.2_spec:1.0.1.Final
。 是否不打算以这种方式使用
java-platform
插件,或者我缺少某些配置选项? 最佳答案
在Gradle中导入BOM意味着您要依赖BOM来应用其提供的约束。
默认情况下,您添加到平台上的是约束。但是,仅当且仅当存在匹配的依赖项声明时,约束才会出现在图形中。同样,约束条件仅告知目标模块。他们从不带来任何传递信息。
因此,您需要做的是声明您的platform
项目取决于BOM。然后它将按预期导出其约束。
// 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
}
}
关于Gradle Java平台插件和平台定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54647730/