Статьи

Gradle Good: добавление зависимостей только для упаковки в войну

Мой коллега, Том Уэтдженс, написал в блоге пост -зависимые зависимости в 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 .