Когда библиотечная зависимость добавлена ​​с использованием «api», не обеспечивает доступ к их библиотеке, которая объявлена ​​с использованием «реализации» в Gradle? - PullRequest
1 голос
/ 13 февраля 2020

LibA добавляется в модуль приложения с помощью «api», а LibB добавляется в LibA с помощью «реализации».

Я не могу получить доступ к LibB внутри приложения, он выдает ошибку компиляции.

Может кто-нибудь объяснить, что здесь происходит? Я что-то упускаю или неправильно понимаю понятие «API», «реализация»?.

dependency

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Объяснение можно найти в официальной документации плагина Java Библиотека , особенно в разделе API и разделение реализации глава:

Плагин предоставляет две конфигурации, которые можно использовать для объявления зависимостей: API и реализация. Конфигурация api должна использоваться для объявления зависимостей, которые экспортируются библиотечным API, тогда как конфигурация реализации должна использоваться для объявления зависимостей, которые являются внутренними для компонента.

Основная идея с конфигурацией APi чтобы избежать утечки внутренних зависимостей библиотечного модуля в путь к классу потребителя библиотеки.

В вашем случае LibB рассматривается как внутренняя зависимость от LibA, как это определено в конфигурации implementation, следовательно, вы не должны обращаться к LibB непосредственно в вашем модуле App.

Если вам нужно использовать библиотеку LibB с App, просто объявите прямую зависимость от App до LibB, с конфигурацией api или implementation.

0 голосов
/ 13 февраля 2020

Зависимость api в основном транзитивна по своей природе только для своих проектов верхнего уровня. Так что в вашем случае, если вы хотите, чтобы LibB был выставлен на App , то вы можете иметь такие зависимости, как это -

App с implementation зависимостью LibA и LibA с api зависимостью LibB

Это позволит LibB для транзитивного доступа к приложению

Но следует использовать api зависимость осторожно и только при необходимости.

...