我的同事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 configurationclasspath 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
:buildBUILD SUCCESSFULTotal time: 6.18 secs
$ jar tvf build/libs/package-only-dep-example.war0 Fri Sep 19 05:59:54 CEST 2014 META-INF/25 Fri Sep 19 05:59:54 CEST 2014 META-INF/MANIFEST.MF0 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.jar115 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 dependenciescompile - Compile classpath for source set 'main'.
\--- org.slf4j:slf4j-api:1.7.7default - Configuration for default artifacts.
\--- org.slf4j:slf4j-api:1.7.7providedCompile - Additional compile classpath for libraries that should not be part of the WAR archive.
No dependenciesprovidedRuntime - Additional runtime classpath for libraries that should not be part of the WAR archive.
No dependenciesruntime - Runtime classpath for source set 'main'.
\--- org.slf4j:slf4j-api:1.7.7testCompile - Compile classpath for source set 'test'.
+--- org.slf4j:slf4j-api:1.7.7
\--- junit:junit:4.11\--- org.hamcrest:hamcrest-core:1.3testRuntime - 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.7warLib
+--- 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 SUCCESSFULTotal time: 6.274 secs

用Gradle 2.1编写的代码。

翻译自: https://www.javacodegeeks.com/2014/09/gradle-goodness-adding-dependencies-only-for-packaging-to-war.html

摇篮善良:仅添加包装用于战争相关推荐

  1. Gradle善良:仅添加包装用于战争

    我的同事Tom Wetjens 在Maven中撰写了博客文章仅打包依赖项 . 当我们想在WAR文件中包含依赖项时,他展示了一种Maven解决方案,而在其他任何作用域中都没有使用. 在这篇博客中,我们将 ...

  2. Vue,简洁方式开发web,仅添加vue.js文件,不使用全家桶

    index.html主页引入main.js main.js引入App.js 也就是套娃--简单的不要不要的 index.html里面引入文件[注意这里有个div id ="app" ...

  3. 实时录制视频,实时去除人_录制实时演示,第2部分:软件设置

    实时录制视频,实时去除人 如果您是进行现场会议的团队的一员,则有可能要录制发言人的演讲并在网上发布. 幸运的是,这要归功于开源软件和现成的硬件,这在今天是容易且相对便宜的. 有关录制实时演示文稿的本系 ...

  4. 将$type添加到System.Text.Json序列化中,就像Newtonsoft那样用于动态对象属性

    目录 介绍 用户故事5:在System.Text.Json JsonSerializer中支持动态类型 演示项目和测试 修改模型方法 包装方法 总结 Pro Coders团队最近将一个大型项目从New ...

  5. 针对新手的Java EE7和Maven项目-第2部分-为我们的应用程序定义一场简单的战争

    从第一部分恢复 第1部分 我们刚刚定义了父 pom. 一种特殊的pom类型,它最终定义了我们的应用程序将要使用的库. 它还配置了所有用于包装我们应用程序每个模块的Maven工具. 您可以在此处 签出 ...

  6. 针对新手的Java EE7和Maven项目–第2部分–为我们的应用程序定义一场简单的战争...

    从第一部分恢复 第1部分 我们刚刚定义了父 pom. 一种特殊的pom类型,它最终定义了我们的应用程序将要使用的库. 它还配置了所有用于打包我们应用程序每个模块的Maven工具. 您可以在此处 签出 ...

  7. 经济学人:人工智能正颠覆传统战争,一场新军备竞赛或将开启

    大数据文摘出品 来源:Economist 编译:赵伟.楚阳.武帅 今年阅兵的两个大杀器--DF-17和DF-41被广泛关注,然而文摘菌却从三个无人作战方队中,看到了一丝不寻常. 无人作战与人工智能的发 ...

  8. 依赖包装了还是提示不存在_为什么要(通常)包装您的依赖关系

    依赖包装了还是提示不存在 包裹您的依赖关系如何使您免于将来的痛苦 (How Wrapping Your Dependencies Will Save You From Future Suffering ...

  9. 媒体查询中“屏幕”和“仅屏幕”之间有什么区别?

    本文翻译自:What is the difference between "screen" and "only screen" in media queries ...

最新文章

  1. 网警信息安全!_只愿与一人十指紧扣_新浪博客
  2. java多线程 ThreadPoolExecutor 策略的坑
  3. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
  4. 求方差时为什么要除以N—1,而不是除以N!【通俗理解-非数学专业】
  5. php的异常详解,php5异常处理详解_php
  6. 上海1.3万座玻璃幕墙建筑“一网统管”
  7. Android--获取App应用程序的大小
  8. kafka中处理超大消息的一些考虑
  9. 基于springboot的mysql实现动态切换数据源
  10. 班级html网页设计实例,静态网页班级网站设计.doc
  11. 酒吧、ktv、夜店收银系统分析
  12. lightblue使用教程_使用LightBlue Bean和IFTTT自动化LIFX灯
  13. HDMI接口定义,传输流程
  14. ArcGIS单波段影像重分类与批处理
  15. 王超(清华大学博士)Linux期末考核
  16. flash 游戏开发工作总结(1)--开发准备:FB的配置
  17. TensorFlow1.x入门(2)——变量的定义及其操作
  18. Unable to access jar file xxx.jar问题的解决
  19. 整体改革理论(简介)
  20. Vue基础语法之@click、时间修饰符@click.stop与@click.prevent、按键修饰符(如@keyup.enter)

热门文章

  1. 2014年JAVA省赛B组---第四题---大衍数列
  2. php如何求同列元素之和_求得这个数组中各个元素之和
  3. linux原有的文件系统扩展,原来linux不用LVM也能扩展文件系统
  4. 布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项
  5. servlet session 跟踪用户上次访问时间
  6. mybatis_user_guide(7) SQL语句构建器类
  7. java安全——数字签名+代码签名
  8. 本地线程分配缓冲_线程本地分配缓冲区
  9. java 方法 示例_Java 9示例–收集的工厂方法–创建不可修改的列表,集合和映射...
  10. string拆分为int_拆分为流