Gradle java-library插件与java插件相比

时间:2017-10-07 05:34:39

标签: gradle

java-library plugin的Gradle文档中声明:

  

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

此声明暗示只有要使用的java程序(库)才应使用java-library插件;虽然,不打算使用的java程序(应用程序)应使用java插件。

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

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

    // other common java stuff
}

但是现在在具有应用程序和库的多模块项目中,您无法将插件选择委托给子项目并具有以下根build.gradle

subprojects {
    sourceCompatibility '1.8'
    targetCompatibility '1.8'

    // other common java stuff
}

这会失败,因为sourceCompatibilitytargetCompatibility插件定义了javajava-library。理想情况下,我想做以下事情:

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

    // other common java stuff
}

有没有理由强制java应用程序使用java插件并且java库使用java-library插件?是否有任何理由要使用java插件而不是java-library插件?

修改

为了进一步澄清我的问题,在Gradle示例中,有一个包含java插件herejava-library插件here的多模块项目。在java插件的示例中,root build.grade使用apply plugin: 'java'java-library插件的root build.gradle不使用任何插件。应用项目使用apply plugin: 'java';而核心和utils项目使用apply plugin: 'java-library'

我的问题是为什么某些项目应该使用java插件而其他项目使用java-library插件?它似乎使得不违反DRY原则变得更加困难。我很难指定sourceCompatibilitytargetCompatibility一次。我可以想到一些方法一次指定这些属性,但最简单的解决方案似乎是对所有项目使用java-library

对某些子项目使用java插件和为其他子项目使用java-library插件有什么好处吗?

3 个答案:

答案 0 :(得分:2)

根据docs

  

[...] Java Library插件仅与java插件正确连接。

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

请注意,您可以通过PluginManager的{​​{3}}方法或PluginContainer的{​​{3}}方法指定与插件相关的配置。适用于这两种方法:

  

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

subprojects { sub ->
    sub.plugins.withId('java-library') {
        // configure sub
    }
}

答案 1 :(得分:0)

  

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

还有:

  

api配置应该用于声明由库API导出的依赖项,而implementation配置应该用于声明组件内部的依赖项。

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

答案 2 :(得分:0)

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

您的问题

  

在某些子项目中使用java插件,在其他子项目中使用java-library插件是否有好处?

回答
  

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

     

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

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

  

在Gradle 5.3或更早版本中,某些插件(例如Groovy插件)可能无法正常运行。