Gradle: В чем разница между зависимостями classpath и компиляции?
При добавлении зависимостей к моему проекту я никогда не сомневаюсь, какой префикс я должен дать им, например. "classpath"
или "compile".
Например, должны ли мои зависимости ниже компилировать время или путь к классам?
Кроме того, должно ли это быть в моих приложениях build.gradle или в конкретном модуле build.gradle?
Текущий build.gradle(на уровне приложения):
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile 'org.hibernate:hibernate-core:5.0.5.Final'
compile 'mysql:mysql-connector-java:5.1.38'
}
Ответы
Ответ 1
Я собираюсь предположить, что вы ссылаетесь на compile
и classpath
в блоке dependencies {}
. Если это так, это зависимость Конфигурации.
Конфигурация - это просто именованный набор зависимостей.
Конфигурация compile
создается плагином Java. Конфигурация classpath
обычно рассматривается в блоке buildSrc {}
, где нужно объявлять зависимости для build.gradle, сам (для плагинов, возможно).
Ответ 2
Если самому buildscript нужно что-то запустить, используйте classpath.
Если вашему проекту нужно что-то запустить, используйте compile.
Блок buildscript{}
предназначен для самого build.gradle.
Для многоуровневой сборки файл сборки верхнего уровня предназначен для корневого проекта, конкретный файл сборки - для подпроекта (модуля).
Файл сборки верхнего уровня, в который вы можете добавить параметры конфигурации, общие для всех подпроектов/модулей.
Не размещайте зависимости приложения в файле сборки верхнего уровня, они принадлежат отдельным файлам build.gradle модуля
Ответ 3
Если я правильно понимаю, вы Project.dependencies
блок скрипта Project.dependencies
со блоком скрипта Project.buildscript.dependencies
(точно так же, как я делал, когда достигал этого вопроса).
Я постараюсь ответить на это с тем, что я нашел.
Я думаю, что вы должны быть уже знакомы с блоком сценария Project.dependencies
. В этом блоке мы объявляем зависимости, требуемые нашим исходным кодом. Есть несколько способов объявить зависимость, которая нам нужна для проекта. Смотрите Gradle Tutorial: Типы зависимостей. Я упомяну только ту часть, которая наиболее актуальна для этой проблемы:
compile 'org.hibernate:hibernate-core:5.0.5.Final'
- это объявление зависимости модуля. Конфигурация компиляции (которая в настоящее время устарела из-за конфигурации реализации) является просто ключевым словом для Implementation only dependencies.
для Implementation only dependencies.
Это не ключевое слово, описывающее, какой это тип зависимости (по типу здесь я следую трем типам, определенным в учебном пособии, т.е. Модуль, файл и проект).
В Gradle Tutorial: Organizing Build Logic написано:
Если вашему сценарию сборки необходимо использовать внешние библиотеки, вы можете добавить их в путь к сценариям в самом сценарии сборки. Вы делаете это, используя метод buildscript(), передавая замыкание, которое объявляет путь к классу сценария сборки.
Это так же, как вы объявляете, например, путь к классу компиляции Java. Вы можете использовать любой из типов зависимостей, описанных в Типах зависимостей, кроме проектных зависимостей.
Объявив путь к классам сценария сборки, вы можете использовать классы в вашем сценарии сборки так же, как и любые другие классы в пути к классам.
Я надеюсь, что теперь все становится ясно.
Используя classpath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"
мы устанавливаем метод classpath
с помощью com.android.tools.build:gradle:${Versions.android_gradle_plugin}
который является зависимостью модуля, которая является используется самим сценарием сборки, а не источником в вашем проекте.
С другой стороны, при compile 'org.hibernate:hibernate-core:5.0.5.Final'
мы объявляем зависимость модуля, необходимую для вашего проекта с конфигурацией компиляции.
tl; dr: classpath
, compile
и implementation
- все ключевые слова, которые могут использоваться против зависимостей при различных обстоятельствах. Первый используется, когда вы хотите передать зависимость в сценарий сборки, а второй является одной из конфигураций, которые вы можете объявить.