ТЛ; др
Просто замените:
compile
с implementation
(если вам не нужна транзитивность) или api
(если вам нужна транзитивность)
testCompile
с testImplementation
debugCompile
с debugImplementation
androidTestCompile
с androidTestImplementation
compileOnly
все еще в силе. Он был добавлен в 3.0, чтобы заменить предоставленный и не компилировать. ( provided
введено, когда у Gradle не было имени конфигурации для этого варианта использования и назвали его в соответствии с предоставленной областью Maven.)
Это одно из важнейших изменений, появившихся в Gradle 3.0, о котором Google объявил на IO17 .
compile
Конфигурация теперь осуждается и должна быть заменена implementation
илиapi
Из документации Gradle :
dependencies {
api 'commons-httpclient:commons-httpclient:3.1'
implementation 'org.apache.commons:commons-lang3:3.5'
}
Зависимости, появляющиеся в api
конфигурациях, будут транзитивно открыты для потребителей библиотеки и, как таковые, появятся на пути к классам компиляции потребителей.
Зависимости, обнаруженные в implementation
конфигурации, с другой стороны, не будут видны потребителям и, следовательно, не попадут в путь к классам компиляции потребителей. Это имеет несколько преимуществ:
- зависимости больше не попадают в путь к классам компиляции потребителей, поэтому вы никогда не будете случайно зависеть от транзитивной зависимости
- более быстрая компиляция благодаря уменьшенному размеру пути к классам
- меньше перекомпиляций при изменении зависимостей реализации: потребителям не нужно будет перекомпилировать
- Более чистая публикация: при использовании в сочетании с новым плагином maven-publish библиотеки Java создают файлы POM, которые точно различают то, что требуется для компиляции с библиотекой, и то, что требуется для использования библиотеки во время выполнения (другими словами, не смешайте то, что необходимо для компиляции самой библиотеки и что нужно для компиляции с библиотекой).
Конфигурация компиляции все еще существует, но ее не следует использовать, поскольку она не дает гарантий, которые предоставляют конфигурации api
и implementation
.
Примечание: если вы используете только библиотеку в модуле приложения - в общем случае - вы не заметите никакой разницы.
Вы увидите разницу, только если у вас есть сложный проект с модулями, зависящими друг от друга, или вы создаете библиотеку.
implementation
скрывать зависимость. Мой вопрос имеет смысл?implementation
только x api будет отображаться, но если вы используетеapi
y, z также будет отображаться.Ответ на этот вопрос будет продемонстрировать разницу между
implementation
,api
иcompile
на проекте.Допустим, у меня есть проект с тремя модулями Gradle:
app
имеетmyandroidlibrary
как зависимости.myandroidlibrary
имеетmyjavalibrary
как зависимости.myjavalibrary
имеетMySecret
классmyandroidlibrary
имеетMyAndroidComponent
класс, который манипулирует значением изMySecret
класса.Наконец,
app
интересует только значение изmyandroidlibrary
Теперь поговорим о зависимостях ...
app
потреблять:myandroidlibrary
, поэтому вapp
build.gradle пользуйтесьimplementation
.( Примечание : вы также можете использовать api / compile. Но подождите немного.)
Как вы думаете,
myandroidlibrary
как должен выглядеть build.gradle? Какой объем мы должны использовать?У нас есть три варианта:
Компиляция или API (вариант № 2 или № 3)
Если вы используете
compile
илиapi
. Наше приложение для Android теперь может получить доступ кmyandroidcomponent
зависимости, которая являетсяMySecret
классом.Реализация (вариант № 1)
Если вы используете
implementation
конфигурацию,MySecret
не подвергается.Итак, какую конфигурацию вы должны выбрать? Это действительно зависит от вашего требования.
Если вы хотите выставить зависимости, используйте
api
илиcompile
.Если вы не хотите раскрывать зависимости (скрывая свой внутренний модуль), используйте
implementation
.Замечания:
Это просто суть конфигураций Gradle, см. Таблицу 49.1. Плагин библиотеки Java - конфигурации, используемые для объявления зависимостей для более подробного объяснения.
Пример проекта для этого ответа доступен по адресу https://github.com/aldoKelvianto/ImplementationVsCompile.
источник
compile
не гарантирует то же самое, чтоapi
гарантирует.Compile
конфигурация устарела и должна быть замененаimplementation
илиapi
.Вы можете прочитать документы по адресу https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation .
Краткая часть
Для дальнейшего объяснения обратитесь к этому изображению.
источник
Краткое решение:
Лучший подход - заменить все
compile
зависимости наimplementation
зависимости. И только там, где у вас есть утечка интерфейса модуля, вы должны использоватьapi
. Это должно вызвать гораздо меньше перекомпиляции.Объясни подробней:
До появления плагина Android Gradle 3.0 : у нас была большая проблема: одно изменение кода приводит к перекомпиляции всех модулей. Основная причина этого заключается в том, что Gradle не знает, пропускаете ли вы интерфейс модуля через другой или нет.
После плагина Android Gradle 3.0 : последний плагин Android Gradle теперь требует от вас явного определения утечки интерфейса модуля. Исходя из этого, он может сделать правильный выбор в отношении того, что следует перекомпилировать.
Таким образом,
compile
зависимость устарела и заменена двумя новыми:api
: вы пропускаете интерфейс этого модуля через свой собственный интерфейс, что означает то же самое, что и стараяcompile
зависимостьimplementation
: вы используете этот модуль только для внутреннего использования и не пропускаете его через интерфейсТак что теперь вы можете явно сказать Gradle перекомпилировать модуль, если интерфейс используемого модуля изменяется или нет.
Предоставлено блогом Jeroen Mols
источник
источник
implementation
последовал заruntime
.Краткая разница в терминах непрофессионала:
Прочитайте ответ @aldok для подробного примера.
источник
Gradle 3.0
внесены следующие изменения:compile
->api
api
Ключевое слово совпадает с устаревшимcompile
compile
->implementation
Является предпочтительным способом, потому что имеет некоторые преимущества.
implementation
выставить зависимость только на один уровень выше во время сборки (зависимость доступна во время выполнения). В результате вы получаете более быструю сборку (нет необходимости перекомпилировать потребителей, которые имеют уровень выше 1)provided
->compileOnly
Эта зависимость доступна только во время компиляции (зависимость недоступна во время выполнения). Эта зависимость не может быть переходной и быть
.aar
. Может использоваться с процессором аннотаций времени компиляции и позволяет уменьшить конечный выходной файлcompile
->annotationProcessor
Очень похоже на,
compileOnly
но также гарантирует, что переходная зависимость не видна для потребителяapk
->runtimeOnly
Зависимость недоступна во время компиляции, но доступна во время выполнения.
источник
api = public
,implementation = internal
иcompileOnly = private
- мне нужно создать такие псевдонимы для этих функций , поскольку они очень запутанным.Начиная с версии 5.6.3, документация Gradle предоставляет простые практические правила для определения того,
compile
следует ли заменить старую (или новую) зависимость наimplementation
илиapi
:источник