Gradle: Яка різниця між залежностями шляху до класу та компіляції?


92

Додаючи залежності до свого проекту, я ніколи не впевнений, який префікс я повинен їм надати, наприклад "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
Я не впевнений, що розумію. classpathне є допустимою областю залежностей.
Tunaki

Можливо, я заплутався, які дійсні сфери залежності?
java123999

Погляньте на цей документ: docs.gradle.org/current/userguide/…
Тунакі

Одне, що я помітив, це те, що compileOnlyзалежності переходять, project.configurations.compileClasspathале не project.configurations.compile, як згадувалося тут github.com/iboyko/gradle-plugins/issues/5
Vytenis Bivainis

Відповіді:


47

Я збираюся здогадуватися, що ви посилаєтесь compileі classpathперебуваєте в dependencies {}блоці. Якщо це так, це конфігурації залежностей .

Конфігурація - це просто іменований набір залежностей.

compileКонфігурація створюється з допомогою плагіна Java. classpathКонфігурації зазвичай розглядаються в buildSrc {}блоці , де потрібно , щоб оголосити залежності для build.gradle, сам (для плагін, можливо).


Дякую, тож для мого основного build.gradle мені не потрібно використовувати шлях до класу?
java123999

@ java123999 Ні, якщо ви не використовуєте написані на замовлення плагіни
Ерік Венделін

@EricWendelin Де ви говорите "в блоці залежностей {}", ви маєте на увазі "в блоці buildscript {залежностей {}}? (Не впевнений, просто запитую.)
Пауло Мерсон

2
dependencies {}Блок може бути оголошений як всередині , так buildscript {}і поза ним. Перебуваючи всередині, ви використовуєте classpathконфігурацію для залежностей, необхідних для компіляції самого сценарію збірки.
Ерік Венделін,

55

Якщо самому buildscript потрібно щось запустити, використовуйте classpath .

Якщо ваш проект потребує чогось для запуску, використовуйте компіляцію .

buildscript{}Блок для самого build.gradle.

Для побудови декількох проектів файл збірки верхнього рівня призначений для кореневого проекту, а конкретний файл збірки - для підпроекту (модуля).

Файл збірки верхнього рівня, куди можна додати параметри конфігурації, загальні для всіх підпроектів / модулів.

Не розміщуйте залежності додатків у файлі побудови верхнього рівня, вони належать до окремих модулів build.gradle


На підтвердження: чи означає це, що proandroiddev.com/… повинен використовувати a, compileа не a classpath?
WillC

1
Але чому б не помістити залежності додатків у сам файл верхнього рівня, якщо проект має лише один модуль, як типові програми для Android?
Харша

18

Якщо я правильно розумію, ви плутаєте Project.dependenciesблок сценарію з блоком Project.buildscript.dependenciesсценарію (як і я, коли дійшов до цього запитання).

Я спробую відповісти на це тим, що знайшов.

Я думаю, ви вже повинні бути знайомі з Project.dependenciesблоком сценаріїв. У цьому блоці ми оголошуємо залежності, які вимагає наш вихідний код. Є кілька способів оголосити залежність, яка нам потрібна для проекту. Див. Підручник Gradle: Типи залежностей . Я згадаю лише ту частину, яка є найбільш відповідною до цієї проблеми:

compile 'org.hibernate:hibernate-core:5.0.5.Final'- це декларація про залежність модуля. Конфігурація компіляції (яка зараз застаріла конфігурацією реалізації.) - це просто ключове слово. Implementation only dependencies.Це не ключове слово, що описує, який тип залежності це (за типом тут я дотримуюся трьох типів, визначених у навчальному посібнику, тобто модуля, файл і проект.)

У підручнику Gradle: Організація побудови логіки сказано:

Якщо для сценарію збірки потрібно використовувати зовнішні бібліотеки, ви можете додати їх до шляху до класу сценарію в самому сценарії збірки. Ви робите це за допомогою методу 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: The classpath, compileі - implementationце всі ключові слова, які можна використовувати проти залежностей за різних обставин. Перший використовується, коли ви хочете передати залежність до сценарію збірки, а другий - одна з конфігурацій, яку ви можете оголосити.


1
Гарна відповідь. Я повинен додати, що ми не тільки повинні дивитися на самі ключові слова як на те, що було добре описано вище, але крім того, ми також повинні враховувати артефакт, який запитується, оскільки самі по собі ключові слова не визначають повного контексту. Наприклад, 'org.projectlombok:lombok:1.18.4'не має classpathасоціації, оскільки це jar, який потрібен лише під час компіляції, javacале не потрібний під javaчас виконання. Отже, правильне використання - це взаємодія визначених ключових слів та артефакту. Це означає, що потрібні апріорні знання.
Власне
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.