为啥 Gradle 4.4/Java 插件中没有“api”方法,而 “implementation” 是可用的?

Posted

技术标签:

【中文标题】为啥 Gradle 4.4/Java 插件中没有“api”方法,而 “implementation” 是可用的?【英文标题】:Why isn't “api” method available in Gradle 4.4/Java plugin, when “implementation” is?为什么 Gradle 4.4/Java 插件中没有“api”方法,而 “implementation” 是可用的? 【发布时间】:2018-09-07 16:14:20 【问题描述】:

我正在使用 AS 3.1,试图成为一名优秀的程序员并清除“编译已过时”的警告。但我希望这个特殊的 .jar 将 Guava 作为 API 公开。其他项目(例如 CloudServerApplication)也需要 Guava。但是当我使用api 关键字而不是compileimplementation 时,我得到了这个:

>gradlew FrameManager:build

> Configure project :CloudServerApplication
4.4

> Configure project :FrameManager
4.4


FAILURE: Build failed with an exception.

* Where:
Build file 'C:\FrameManager\app\build.gradle' line: 16

* What went wrong:
A problem occurred evaluating project ':FrameManager'.
> Could not find method api() for arguments [com.google.guava:guava:14+] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

我尝试用谷歌搜索错误,但没有发现任何有用的信息。不太确定下一步该去哪里。

我的 build.gradle:

apply plugin: 'java'

println GradleVersion.current().getVersion()

repositories 
    jcenter()


dependencies 
    implementation 'org.json:json:20160212'
    api 'com.google.guava:guava:14+'   //<-- This used to be "compile"

【问题讨论】:

【参考方案1】:

找不到参数的方法 api()

java 插件不包含此方法。

必须使用这个插件:

apply plugin: 'java-library'

您可以查看official doc:

标准 Java 插件和 Java 库插件之间的主要区别在于后者引入了向消费者公开的 API 的概念。库是一个 Java 组件,旨在供其他组件使用。这是多项目构建中非常常见的用例,但在您有外部依赖项时也是如此。

该插件公开了两个可用于声明依赖项的配置:api 和 implementation

【讨论】:

以上是关于为啥 Gradle 4.4/Java 插件中没有“api”方法,而 “implementation” 是可用的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Gradle 不使用插件 pom.xml 中声明的 Maven 存储库?

为啥我会收到错误消息:Android Gradle 插件仅支持 Kotlin Gradle 插件版本 1.3.10 及更高版本

为啥 kotlin gradle 插件无法使用 1.8 目标构建?

为啥我的 Gradle 构建失败并出现“未找到插件 [id: 'org.flywaydb.enterprise.flyway', version: '6.5.0']”错误?

android studio 为啥每次build gradle很慢

为啥 Gradle 会降级 Grails 3.1 应用程序中的传递依赖项?