1 回答
我是否必须使用“java平台”插件?
不,如果您有非 Java 项目,那么您不应该使用 Java 平台插件。正如插件名称所示,它适用于 Java 项目。
Gradle 为 Java 项目提供了一个官方平台插件,但除此之外的任何东西,例如 C++/Swift,您都需要推出自己的插件/平台实现。您可以参考源代码来帮助您的实现。
即使我们都是 Java,对于任何一个项目,我们都不能为它的“api”和它的“运行时”有单独的版本</p>
您不需要为每个配置提供单独的版本。api
扩展implementation
和runtimeClasspath
( runtimeOnly
) 从 扩展implementation
。所以声明依赖api
应该足够了。请参阅此处的依赖关系图。
Gradle 如何知道在使用平台的项目和平台规范之间匹配哪些配置的约束?
通过您在项目中指定它的方式以及 Java 平台插件的平台实现。例如,给定以下平台:
// my-platform
plugins {
`java-platform`
}
dependencies {
constraints {
api("commons-httpclient:commons-httpclient:3.1")
}
}
我可以在项目中执行以下任何操作:
dependencies {
api(platform(":my-platform"))
implementation(platform(":my-platform"))
annotationProcessor(platform(":my-platform"))
}
我希望 Gradle 不会尝试通过简单的名称匹配将“api”与“api”匹配
根据使用情况进行匹配。看到这条线和这些线。api
只是为他们的插件选择的配置名称 Gradle,请参见此处。他们实际上可以选择任何名称,但更有可能选择api
/runtime
以保持与他们所拥有的相似的事物。
您将在平台上找到的大多数文档都是面向 Java 开发人员的。我相信这主要是因为平台的概念受到Maven 的 BOM 的极大启发
如果你真的想知道 Gradle 是如何在平台上做事的,那么要么痛苦地检查源代码,要么编写一个使用该平台的简单 Gradle 插件,然后使用GradleRunner编写一个测试并使用断点进行调试。示例插件可能是:
public class ExamplePlatformPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.getRepositories().mavenCentral();
DependencyHandler dependencies = project.getDependencies();
// api(platform(""org.springframework.boot:spring-boot-dependencies:2.2.6.RELEASE"")
Dependency springBootPlatform = dependencies.platform("org.springframework.boot:spring-boot-dependencies:2.2.6.RELEASE");
dependencies.add(JavaPlugin.API_CONFIGURATION_NAME, springBootPlatform);
// api("org.apache.commons:commons-lang3")
dependencies.add(JavaPlugin.API_CONFIGURATION_NAME, "org.apache.commons:commons-lang3");
}
}