我的同事Tom Wetjens 在Maven中撰写了博客文章仅打包依赖项 。 当我们想在WAR文件中包含依赖项时,他展示了一种Maven解决方案,而在其他任何作用域中都没有使用。 在这篇博客中,我们将看到我们如何在Gradle中解决这个问题。
假设我们在项目中使用SLF4J Logging API。 我们将API用作编译依赖项,因为我们的代码使用此API。 但是在测试运行时中,我们想使用此API的SLF4J Simple实现。 并且在我们的WAR文件中,我们希望包括API的Logback实现。 Logback依赖关系仅需要包含在WAR文件中,并且不应存在于任何其他依赖关系配置中。
我们首先将War插件添加到我们的项目中。 war
任务使用runtime
依赖项配置来确定将哪些文件添加到WAR文件中的WEB-INF/lib
目录中。 我们添加了新的依赖项配置warLib
,以扩展项目中的runtime
配置。
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文件:
$ 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
任务时,我们可以看到SLF4J API的实现与依赖项配置之间的关系:
$ 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编写的代码。