Мой коллега, Том Уэтдженс, написал в блоге пост -зависимые зависимости в Maven . Он показал решение Maven, когда мы хотим включить в файл WAR зависимости, которые не используются ни в каких других областях. В этом посте мы увидим, как мы решаем эту проблему в Gradle.
Предположим, мы используем SLF4J Logging API в нашем проекте. Мы используем API как зависимость компиляции, потому что наш код использует этот API. Но в нашей тестовой среде мы хотим использовать SLF4J Simple реализацию этого API. И в нашем WAR-файле мы хотим включить реализацию API Logback. Зависимость Logback требуется только для включения в WAR-файл и не должна существовать ни в какой другой конфигурации зависимостей.
Сначала мы добавляем плагин War в наш проект. Задача war
использует конфигурацию зависимостей runtime
чтобы определить, какие файлы добавляются в каталог WEB-INF/lib
в нашем файле WAR. Мы добавили новую конфигурацию зависимостей warLib
которая расширяет конфигурацию runtime
в нашем проекте.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
apply plugin: 'war' repositories.jcenter() configurations { // Create new dependency configuration // for dependencies to be added in // WAR file. warLib.extendsFrom runtime } dependencies { // API dependency for Slf4j. compile 'org.slf4j:slf4j-api:1.7.7' testCompile 'junit:junit:4.11' // Slf4j implementation used for tests. testRuntime 'org.slf4j:slf4j-simple:1.7.7' // Slf4j implementation to be packaged // in WAR file. warLib 'ch.qos.logback:logback-classic:1.1.2' } war { // Add warLib dependency configuration classpath configurations.warLib // We remove all duplicate files // with this assignment. // geFiles() method return a unique // set of File objects, removing // any duplicates from configurations // added by classpath() method. classpath = classpath.files } |
Теперь мы можем запустить задачу build
и получить WAR-файл со следующим содержимым:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
$ gradle build :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :war :assemble :compileTestJava :processTestResources UP-TO-DATE :testClasses :test :check :build BUILD SUCCESSFUL Total time: 6.18 secs $ jar tvf build/libs/ package -only-dep-example.war 0 Fri Sep 19 05 : 59 : 54 CEST 2014 META-INF/ 25 Fri Sep 19 05 : 59 : 54 CEST 2014 META-INF/MANIFEST.MF 0 Fri Sep 19 05 : 59 : 54 CEST 2014 WEB-INF/ 0 Fri Sep 19 05 : 59 : 54 CEST 2014 WEB-INF/lib/ 29257 Thu Sep 18 14 : 36 : 24 CEST 2014 WEB-INF/lib/slf4j-api- 1.7 . 7 .jar 270750 Thu Sep 18 14 : 36 : 24 CEST 2014 WEB-INF/lib/logback-classic- 1.1 . 2 .jar 427729 Thu Sep 18 14 : 36 : 26 CEST 2014 WEB-INF/lib/logback-core- 1.1 . 2 .jar 115 Wed Sep 03 09 : 24 : 40 CEST 2014 WEB-INF/web.xml |
Также, когда мы запускаем задачу dependencies
мы можем видеть, как реализации API SLF4J связаны с конфигурациями зависимостей:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
$ gradle dependencies :dependencies ------------------------------------------------------------ Root project ------------------------------------------------------------ archives - Configuration for archive artifacts. No dependencies compile - Compile classpath for source set 'main' . \--- org.slf4j:slf4j-api: 1.7 . 7 default - Configuration for default artifacts. \--- org.slf4j:slf4j-api: 1.7 . 7 providedCompile - Additional compile classpath for libraries that should not be part of the WAR archive. No dependencies providedRuntime - Additional runtime classpath for libraries that should not be part of the WAR archive. No dependencies runtime - Runtime classpath for source set 'main' . \--- org.slf4j:slf4j-api: 1.7 . 7 testCompile - Compile classpath for source set 'test' . +--- org.slf4j:slf4j-api: 1.7 . 7 \--- junit:junit: 4.11 \--- org.hamcrest:hamcrest-core: 1.3 testRuntime - Runtime classpath for source set 'test' . +--- org.slf4j:slf4j-api: 1.7 . 7 +--- junit:junit: 4.11 | \--- org.hamcrest:hamcrest-core: 1.3 \--- org.slf4j:slf4j-simple: 1.7 . 7 \--- org.slf4j:slf4j-api: 1.7 . 7 warLib +--- org.slf4j:slf4j-api: 1.7 . 7 \--- ch.qos.logback:logback-classic: 1.1 . 2 +--- ch.qos.logback:logback-core: 1.1 . 2 \--- org.slf4j:slf4j-api: 1.7 . 6 -> 1.7 . 7 (*) - dependencies omitted (listed previously) BUILD SUCCESSFUL Total time: 6.274 secs |
Код написанный с Gradle 2.1.
Ссылка: | Gradle Good: добавление зависимостей только для упаковки в войну от нашего партнера JCG Хьюберта Иккинка в блоге JDriven . |