Gradle java库插件与java插件的比较

Gradle java库插件与java插件的比较,gradle,Gradle,在it部门的Gradle文档中指出: Java库插件通过提供有关Java库的特定知识扩展了Java插件的功能。特别是,Java库向消费者公开API(即,使用Java或Java库插件的其他项目) 这句话意味着只有打算使用的java程序(库)才应该使用java库插件;但是,不打算使用的java程序(应用程序)应该使用java插件 在使用java库插件之前,根build.gradle文件可能包含以下内容: subprojects { apply plugin: 'java' sourc

在it部门的Gradle文档中指出:

Java库插件通过提供有关Java库的特定知识扩展了Java插件的功能。特别是,Java库向消费者公开API(即,使用Java或Java库插件的其他项目)

这句话意味着只有打算使用的java程序(库)才应该使用
java库
插件;但是,不打算使用的java程序(应用程序)应该使用
java
插件

在使用
java库
插件之前,根
build.gradle
文件可能包含以下内容:

subprojects {
    apply plugin: 'java'
    sourceCompatibility '1.8'
    targetCompatibility '1.8'

    // other common java stuff
}
subprojects {
    apply plugin: 'java-library'
    sourceCompatibility '1.8'
    targetCompatibility '1.8'

    // other common java stuff
}
但是,现在在同时具有应用程序和库的多模块项目中,您不能将插件选择委托给子项目,并且具有以下根
build.gradle

subprojects {
    sourceCompatibility '1.8'
    targetCompatibility '1.8'

    // other common java stuff
}
这将失败,因为
sourceCompatibility
targetCompatibility
java
java库
插件定义。理想情况下,我想做以下工作:

subprojects {
    apply plugin: 'java'
    sourceCompatibility '1.8'
    targetCompatibility '1.8'

    // other common java stuff
}
subprojects {
    apply plugin: 'java-library'
    sourceCompatibility '1.8'
    targetCompatibility '1.8'

    // other common java stuff
}
是否有任何理由强制java应用程序使用
java
插件,而java库使用
java库
插件?是否有理由使用
java
插件而不是
java库
插件

编辑

为了进一步澄清我的问题,在Gradle示例中,有一个针对
java
插件和
java库
插件的多模块项目。在
java
插件的示例中,root build.grade使用
apply插件:“java”
java库
插件的root build.gradle不使用任何插件。应用程序项目使用
apply插件:“java”
;而核心和utils项目使用
apply插件:“java库”

我的问题是为什么一些项目应该使用
java
插件,而其他项目应该使用
java库
插件?这似乎使不违反干燥原则变得更加困难。我使得仅指定一次
sourceCompatibility
targetCompatibility
非常困难。我可以想出几种方法一次性指定这些属性,但最简单的解决方案似乎是对所有项目使用
java库

对某些子项目使用
java
插件,对其他子项目使用
java库
插件,有什么好处吗

该插件公开了两种可用于声明依赖关系的配置:
api
实现

而且:

api
配置应用于声明库api导出的依赖项,而
实现
配置应用于声明组件内部的依赖项

引入了Gradle 3.4,允许您控制是否将依赖项发布到使用该库的项目的编译和运行时类路径。
如果您想使用新的
api
配置而不是
compile
,则必须使用新插件。

根据

[…]Java库插件只能通过
Java
插件正常运行

因此,如果您将这两个插件应用到一个项目中,您不应该遇到任何问题。例如,您可以通过
子项目
闭包将
java
插件应用于每个项目,然后将
java库
插件应用于需要插件附加功能的子项目(通过其
build.gradle
文件)

请注意,您可以通过
PluginManager
PluginContainer
的方法指定依赖于插件的配置。这两种方法均适用:

如果插件已经应用,则执行该操作。如果稍后应用了插件,则将在应用插件后执行该操作。如果插件从未应用过,则该操作永远不会执行


我也有同样的问题,并在官方插件文档的末尾找到了答案:

你的问题

在一些子项目中使用java插件,在其他子项目中使用java库插件,有什么好处吗

答案是

增加了消费者的内存使用量

当项目使用Java库插件时,使用者将直接在其编译类路径上使用该项目的输出类目录,而不是使用jar文件(如果项目使用Java插件)。一个间接的结果是,最新的检查将需要更多的内存,因为Gradle将快照单个类文件,而不是单个jar。这可能会导致大型项目的内存消耗增加

还有一段关于其他插件的问题以及如何解决这些问题

在Gradle 5.3或更早版本中,一些插件(如Groovy插件)可能无法正常工作


我了解java库插件的新特性,并希望在我的库中使用它们,但是有任何理由在应用程序中使用java插件吗?应用程序没有理由使用api配置,java插件支持实现配置。但是我想知道我是否应该在应用程序中使用java插件?@Dragon刺客目前没有理由在应用程序中使用它,但这只是一个观点。我已经编辑了我的问题。希望这能更清楚地解释为什么我认为使用这两个插件是有问题的。它还应该解释为什么我想知道使用java库插件是否有任何缺点。这很有趣,我以前没有见过
withPlugin
withId
方法。这个定义