正确使用“实施”

Posted

技术标签:

【中文标题】正确使用“实施”【英文标题】:Proper use of 'implementation' 【发布时间】:2019-03-07 05:55:42 【问题描述】:

我有一个具有以下结构的项目。

+-MyApplication
+-MyLibrayOne
+-MyLibrayTwo

MyApplication 是我的主要应用程序,而 MyLibrayOneMyLibrayTwo 是导入到项目中的两个库。 MyApplication 使用MyLibrayOne 的某些类,MyLibrayOne 使用MyLibrayTwo 的某些类。

MyLibrayOne.gradle文件中我使用了- compile project(':MyLibrayTwo')。一切正常。但是如果我用implementation 替换compile,它就不能从MyLibrayTwo 导入类。它给出了error: cannot find symbol class XXXX 错误。

【问题讨论】:

您需要使用api。看到这个帖子:link 【参考方案1】:

首先,我鼓励您查看Google I/O 2017。 编译和实现不是一回事。 compile 允许应用程序访问子库可以访问的所有子依赖项。这意味着如果 MyLibrayOne 依赖于 MyLibraryTwo 并且您还需要从 MyLibrarayTwo 访问该类,则您必须使用 compile 指令直接 gradle 以公开 MyLibrayTwo 中的类。 如果不需要,那么实施就足够了。 我只能猜测你的情况是前者,所以你需要继续使用 compile。由于现在不推荐使用 compile ,因此请使用 api 指令。他们是一样的。 另外,请查看gradle documentation。

【讨论】:

在我的例子中,MyLibrayOne 使用来自 MyLibrayTwo 的类,但 MyLibrayTwo 是独立的 - MyLibrayTwo 不使用 MyLibrayOne 的任何类。如果我使用 'compile',我会收到警告 - “配置 'compile' 已过时,已替换为 'implementation' 和 'api'。它将在 2018 年底被删除” opps - 忘了告诉你。用api替换编译。他们应该是一样的。我将编辑答案以更好地反映这一点。 另一个很好的信息来源是:Implementation Vs Api in android Gradle plugin 3.0【参考方案2】:

使用api 而不是implementation 将解决您的问题。 IE。

dependencies 
    // Enforce the runtime dependencies
    api project(':MyLibrayOne')
    api project(':MyLibrayTwo')

简单解释一下,api 会让依赖项目看到所有依赖项目的类,但implementation 不能这样做。

【讨论】:

以上是关于正确使用“实施”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GSM 通话正确实施 Call.conference (Android API 23+)?

我是不是正确实施了 ActiveMQ?实现交易会话并重试

如何正确实施“photo.service”?

Laravel 5.2 或 5.3:如何正确实施检查会话是不是已登录

实施SSL的正确方法是什么?

实施定期行动的正确方法