gradle引入依赖:_Gradle入门:依赖管理

gradle引入依赖:

即使不是没有可能,创建没有任何外部依赖关系的现实应用程序也是一项挑战。 这就是为什么依赖性管理是每个软件项目中至关重要的部分的原因。

这篇博客文章描述了我们如何使用Gradle管理项目的依赖关系。 我们将学习配置已使用的存储库和所需的依赖项。 我们还将通过实现一个简单的示例应用程序将此理论应用于实践。

让我们开始吧。

补充阅读:

  • Gradle入门:简介可帮助您安装Gradle,描述Gradle构建的基本概念,并描述如何使用Gradle插件向构建中添加功能。
  • Gradle入门:我们的第一个Java项目描述了如何使用Gradle创建Java项目并将应用程序打包到可执行jar文件中。

储存库管理简介

存储库实质上是依赖项容器,每个项目可以使用零个或多个存储库。

Gradle支持以下存储库格式:

  • 常春藤仓库
  • Maven仓库
  • 平面目录存储库

让我们了解如何在构建中配置每种存储库类型。

将常春藤存储库添加到我们的构建中

我们可以使用它的url地址或它在本地文件系统中的位置将Ivy存储库添加到我们的构建中。

如果我们想使用其URL地址添加一个Ivy存储库,则必须将以下代码片段添加到build.gradle文件中:

repositories {ivy {url "http://ivy.petrikainulainen.net/repo"}
}

如果要使用文件系统中的位置添加常春藤存储库,则必须将以下代码片段添加到build.gradle文件中:

repositories {ivy {       url "../ivy-repo"}
}

如果要获取有关配置Ivy存储库的更多信息,则应检查以下资源:

  • Gradle用户指南的第50.6.6节Ivy存储库
  • IvyArtifactRepository的API文档

让我们继续前进,了解如何将Maven存储库添加到我们的构建中。

将Maven存储库添加到我们的构建中

我们可以使用其URL地址或在本地文件系统中的位置将Maven存储库添加到我们的构建中。

如果要使用其URL添加Maven存储库,则必须将以下代码片段添加到build.gradle文件中:

repositories {maven {url "http://maven.petrikainulainen.net/repo"}
}

如果要使用文件系统中的Maven存储库来添加Maven存储库,则必须将以下代码段添加到build.gradle文件中:

repositories {maven {       url "../maven-repo"}
}

在将Maven存储库添加到构建中时,Gradle可以使用三个“别名”。 这些别名是:

  • mavenCentral()别名意味着从中央Maven 2存储库中获取依赖项。
  • jcenter()别名意味着从Bintray的JCenter Maven存储库中获取依赖项。
  • mavenLocal()别名意味着从本地Maven存储库中获取依赖项。

如果要在构建中添加中央Maven 2存储库,则必须将以下代码段添加到build.gradle文件中:

repositories {mavenCentral()
}

如果要获取有关配置Maven存储库的更多信息,则应查阅Gradle用户指南的第50.6.4节“ Maven存储库” 。

让我们继续前进,了解如何向构建中添加平面目录存储库。

将平面目录存储库添加到我们的版本中

如果要使用平面目录存储库,则必须将以下代码片段添加到build.gradle文件中:

repositories {flatDir {dirs 'lib'}
}

这意味着从lib目录中搜索依赖项。 另外,如果需要,可以通过将以下代码段添加到build.gradle文件中来使用多个目录:

repositories {flatDir {dirs 'libA', 'libB'}
}

如果要获取有关平面目录存储库的更多信息,则应检查以下资源:

  • Gradle用户指南的第50.6.5节平面目录存储库
  • Flat Dir Repository发布到gradle用户邮件列表

让我们继续前进,了解如何使用Gradle管理项目的依赖关系。

依赖管理简介

配置项目的存储库后,我们可以声明其依赖项。 如果我们要声明一个新的依赖关系,我们必须执行以下步骤:

  1. 指定依赖项的配置。
  2. 声明所需的依赖项。

让我们仔细看看这些步骤。

将依赖项分组到配置中

在Gradle中,依赖项被分组为一组命名的依赖项。 这些组称为配置,我们使用它们来声明项目的外部依赖关系。

Java插件指定了几种依赖项配置 ,下面对此进行了描述:

  • 当我们编译项目的源代码时,需要将添加到编译配置的依赖项。
  • 运行时配置包含运行时所需的依赖项。 此配置包含添加到编译配置的依赖项。
  • testCompile配置包含编译项目测试所需的依赖项。 此配置包含项目的已编译类以及添加到编译配置中的依赖项。
  • testRuntime配置包含运行我们的测试时所需的依赖项。 此配置包含添加到compileruntimetestCompile配置的依赖项。
  • 档案配置包含我们项目产生的工件(例如Jar文件)。
  • 默认配置组包含运行时所需的依赖项。

让我们继续前进,找出如何声明Gradle项目的依赖项。

声明项目的依存关系

最常见的依赖项称为外部依赖项,可从外部存储库中找到。 通过使用以下属性来标识外部依赖项:

  • group属性标识依赖项的组(Maven用户将此属性称为groupId )。
  • name属性标识依赖项的名称(Maven用户将此属性称为artifactId )。
  • version属性指定外部依赖项的版本(Maven用户将此属性称为version )。

使用Maven存储库时,这些属性是必需的。 如果使用其他存储库,则某些属性可能是可选的。

例如,如果使用平面目录存储库,则可能必须仅指定name和version 。

假设我们必须声明以下依赖关系:

  • 依赖项的组为“ foo”。
  • 依赖项的名称为“ foo”。
  • 依赖项的版本为0.1。
  • 编译我们的项目时需要依赖项。

我们可以通过将以下代码片段添加到build.gradle文件中来声明此依赖性:

dependencies {compile group: 'foo', name: 'foo', version: '0.1'
}

我们还可以使用遵循以下语法的快捷方式形式声明项目的依赖项: [group]:[name]:[version] 。 如果要使用快捷方式表单,则必须将以下代码片段添加到build.gradle文件中:

dependencies {compile	'foo:foo:0.1'
}

我们还可以将多个依赖项添加到同一配置中。 如果要在声明依赖项时使用“常规”语法,则必须将以下代码片段添加到build.gradle文件中:

dependencies {compile ([group: 'foo', name: 'foo', version: '0.1'],[group: 'bar', name: 'bar', version: '0.1'])
}

另一方面,如果我们要使用快捷方式表单, build.gradle文件的相关部分如下所示:

dependencies {compile 'foo:foo:0.1', 'bar:bar:0.1'
}

自然可以声明属于不同配置的依赖项。 例如,如果我们要声明属于compiletestCompile配置的依赖项,则必须向build.gradle文件中添加以下代码片段:

dependencies {compile group: 'foo', name: 'foo', version: '0.1'testCompile group: 'test', name: 'test', version: '0.1'
}

同样,可以使用快捷方式表格。 如果要使用快捷方式表单声明相同的依赖项,则build.gradle文件的相关部分如下所示:

dependencies {compile 'foo:foo:0.1'testCompile 'test:test:0.1'
}

您可以通过阅读50.4如何在Gradle用户指南中声明依赖项来获取有关声明依赖项的更多信息。

现在,我们已经学习了依赖管理的基础知识。 让我们继续并实现示例应用程序。

创建示例应用程序

以下是我们的示例应用程序的要求:

  • 示例应用程序的构建脚本必须使用Maven中央存储库。
  • 示例应用程序必须使用Log4j将接收到的消息写入日志。
  • 示例应用程序必须包含单元测试,以确保返回正确的消息。 这些单元测试必须使用JUnit编写。
  • 我们的构建脚本必须创建一个可执行的jar文件。

让我们找出如何满足这些要求。

配置我们的版本库

示例应用程序的要求之一是其构建脚本必须使用Maven中央存储库。 在配置好构建脚本以使用Maven中央存储库之后,其源代码如下所示(相关部分已突出显示):

apply plugin: 'java'repositories {mavenCentral()
}jar {manifest {attributes 'Main-Class': 'net.petrikainulainen.gradle.HelloWorld'}
}

让我们继续并声明示例应用程序的依赖项。

声明示例应用程序的依赖关系

我们必须在build.gradle文件中声明两个依赖

  1. Log4j(版本1.2.17)用于将接收到的消息写入日志。
  2. JUnit(4.11版)用于为示例应用程序编写单元测试。

声明这些依赖关系后, build.gradle文件如下所示(相关部分突出显示):

apply plugin: 'java'repositories {mavenCentral()
}dependencies {compile 'log4j:log4j:1.2.17'testCompile 'junit:junit:4.11'
}jar {manifest {attributes 'Main-Class': 'net.petrikainulainen.gradle.HelloWorld'}
}

让我们继续写一些代码。

编写代码

为了满足示例应用程序的要求,“我们必须对其进行过度设计”。 我们可以按照以下步骤创建示例应用程序:

  1. 创建一个MessageService类,该类返回字符串“ Hello World!”。 调用其getMessage()方法时。
  2. 创建这确保了MessageServiceTest类的MessageService类返回字符串“世界,你好!”的getMessage()方法。
  3. 创建我们的应用程序的主类,该类从MessageService对象获取消息,并使用Log4j将消息写入日志。
  4. 配置Log4j。

让我们一步一步地完成这些步骤。

首先 ,我们必须在src / main / java / net / petrikainulainen / gradle目录中创建一个MessageService类并实现它。 完成此操作后,其源代码如下所示:

package net.petrikainulainen.gradle;public class MessageService {public String getMessage() {return "Hello World!";}
}

其次 ,我们在src / main / test / net / petrikainulainen / gradle目录中创建了一个MessageServiceTest ,并将单元测试写入了MessageService类的getMessage()方法。 MessageServiceTest类的源代码如下所示:

package net.petrikainulainen.gradle;import org.junit.Before;
import org.junit.Test;import static org.junit.Assert.assertEquals;public class MessageServiceTest {private MessageService messageService;@Beforepublic void setUp() {messageService = new MessageService();}@Testpublic void getMessage_ShouldReturnMessage() {assertEquals("Hello World!", messageService.getMessage());}
}

第三 ,我们在src / main / java / net / petrikainulainen / gradle目录中创建了一个HelloWorld类。 此类是我们应用程序的主要类别。 它从MessageService对象获取消息,然后使用Log4j将其写入日志。 HelloWorld类的源代码如下所示:

package net.petrikainulainen.gradle;import org.apache.log4j.Logger;public class HelloWorld {private static final Logger LOGGER = Logger.getLogger(HelloWorld.class);public static void main(String[] args) {MessageService messageService = new MessageService();String message = messageService.getMessage();LOGGER.info("Received message: " + message);}
}

第四 ,我们必须使用从src / main / resources目录中找到的log4j.properties来配置Log4j。 log4j.properties文件如下所示:

log4j.appender.Stdout=org.apache.log4j.ConsoleAppender
log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.Stdout.layout.conversionPattern=%-5p - %-26.26c{1} - %m\nlog4j.rootLogger=DEBUG,Stdout

这就对了。 让我们找出如何运行示例应用程序的测试。

运行单元测试

我们可以使用以下命令运行单元测试:

gradle test

测试通过后,我们将看到以下输出:

> gradle test
:compileJava
:processResources
:classes
:compileTestJava
:processTestResources 
:testClasses
:testBUILD SUCCESSFULTotal time: 4.678 secs

但是,如果我们的单元测试失败,则会看到以下输出(突出显示了有趣的部分):

> gradle test
:compileJava
:processResources
:classes
:compileTestJava
:processTestResources
:testClasses
:testnet.petrikainulainen.gradle.MessageServiceTest > getMessage_ShouldReturnMessageFAILEDorg.junit.ComparisonFailure at MessageServiceTest.java:221 test completed, 1 failed
:test FAILEDFAILURE: Build failed with an exception.* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///Users/loke/Projects/Java/Blog/gradle-examples/dependency-management/build/reports/tests/index.html* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.BUILD FAILEDTotal time: 4.461 secs

如我们所见,如果我们的单元测试失败,则描述:

  • 哪些测试失败。
  • 运行了多少测试,失败了多少测试。
  • 测试报告的位置,该报告提供有关失败(和通过)测试的其他信息。

当我们运行单元测试时,Gradle将测试报告创建到以下目录:

  • build / test-results目录包含每个测试运行的原始数据。
  • build / reports / tests目录包含一个HTML报告,该报告描述了我们的测试结果。

HTML测试报告是非常有用的工具,因为它描述了测试失败的原因 。 例如,如果我们的单元测试期望MessageService类的getMessage()方法返回字符串“ Hello Worl1d!”,则该测试用例HTML测试报告将如下所示:

测试失败

让我们继续前进,了解如何打包和运行示例应用程序。

打包并运行我们的示例应用程序

我们可以使用以下命令之一打包应用程序:em> gradle assembly或gradle build 。 这两个命令都会在build / libs目录中创建dependency-management.jar文件。

通过使用命令java -jardependency-management.jar运行示例应用程序时,我们看到以下输出:

> java -jar dependency-management.jarException in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Loggerat net.petrikainulainen.gradle.HelloWorld.<clinit>(HelloWorld.java:10)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Loggerat java.net.URLClassLoader$1.run(URLClassLoader.java:372)at java.net.URLClassLoader$1.run(URLClassLoader.java:361)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:360)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 1 more

发生此异常的原因是,当我们运行应用程序时,从类路径中找不到Log4j依赖项。

解决此问题的最简单方法是创建一个所谓的“胖” jar文件。 这意味着我们会将所需的依赖项打包到创建的jar文件中。

在遵循Gradle Cookbook中给出的说明之后,我们的构建脚本如下所示(相关部分已突出显示):

apply plugin: 'java'repositories {mavenCentral()
}dependencies {compile 'log4j:log4j:1.2.17'testCompile 'junit:junit:4.11'
}jar {from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }manifest {attributes 'Main-Class': 'net.petrikainulainen.gradle.HelloWorld'}
}

现在,我们可以运行示例应用程序(打包后),并且可以看到一切正常:

> java -jar dependency-management.jar 
INFO  - HelloWorld                 - Received message: Hello World!

今天就这些。 让我们总结一下我们从此博客文章中学到的知识。

摘要

这篇博客文章教会了我们四件事:

  • 我们学习了如何配置构建所使用的存储库。
  • 我们了解了如何声明所需的依赖关系并将这些依赖关系分组为配置。
  • 我们了解到,Gradle在运行测试时会创建HTML测试报告。
  • 我们学习了如何创建一个所谓的“胖” jar文件。

如果您想玩这个博客文章的示例应用程序,可以从Github获得 。

翻译自: https://www.javacodegeeks.com/2014/07/getting-started-with-gradle-dependency-management.html

gradle引入依赖:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery怎么判断不同的字显示不同的颜色_这个双十一,摄影师的显示器该换了,优派VP2785-2K显示器评测_显示器...

2020-11-03 23:07:380点赞0收藏0评论想攒一台电竞主机、家用主机、酷炫主机无从下手&#xff1f;想省钱又怕性能不达标&#xff1f;值得买帮你打造定制化DIY装机工具&#xff0c;自助全网比价装机&#xff0c;提供最适合的搭配方案&#xff0c;解决各种攒机场景下难题。>快快…

c语言字体取模软件下载,非常好用的lcd汉字取模软件下载_非常好用的lcd汉字取模软件官方下载-太平洋下载中心...

修正了华文中宋汉字模生成过程中的切(底)边现象&#xff0c;配合lcmsim排版仿真软件一起使用&#xff0c;可以大大提高单片机编程的工作效率。几点说明&#xff1a;1。打开功能是专门用于对c语言文件自动提取显示所需要的汉字&#xff0c;进行点阵码数据转换的&#xff0c;在您…

CUBA平台:TypeScript SDK和REST API

在本文中&#xff0c;我们将讨论已存在很长时间但尚未广为人知的CUBA平台的功能- 前端SDK生成器 &#xff0c;并了解它如何与CUBA的REST API插件一起使用 。 Java JavaScript –网络婚姻 仅八年前&#xff0c;我们Java开发人员在我们的Web应用程序中使用JavaScript作为“第二…

wifiphisher 依赖_铂瑞思:总是依赖别人的话,就永远也长不大

我们每个人都会或多或少的对他人产生依赖&#xff0c;依赖一词&#xff0c;可被定义为过度需要依靠他人的支持、指导、照顾和保护。但一部分人由于形成了与他人不同的思维与行为模式&#xff0c;导致了依赖型人格障碍的产生。依赖性人格障碍以过分依赖为特征&#xff0c;表现为…

网站开发用什么语言好_网站开发教程:企业如何用网站开启在线业务?

用网站来开启互联网在线业务是很好的方法&#xff0c;对于创业型企业来说&#xff0c;进行自己的企业网站开发制作能够加快实现品牌业务目标。下面这个教程将会教你如何开展在线业务、并利用网站来扩大业务&#xff01;1.确定目标市场创业团队需要明确自己的目标市场&#xff0…

c语言字符指针初始化赋值,C语言_指针变量的赋值与运算,很详细详解

指针变量的赋值指针变量同普通变量一样&#xff0c;使用之前不仅要定义说明&#xff0c; 而且必须赋予具体的值。未经赋值的指针变量不能使用&#xff0c; 否则将造成系统混乱&#xff0c;甚至死机。指针变量的赋值只能赋予地址&#xff0c; 决不能赋予任何其它数据&#xff0c…

ospf工作原理_OSPF动态路由配置经典案例

前导知识点&#xff1a;静态路由结合上一讲讲解的距离矢量路由协议&#xff0c;本讲我们讲解链路状态路由协议----OSPF&#xff0c;相比较于RIP&#xff0c;OSPF能够支持大型网络&#xff0c;下面列出RIP和OSPF的对比图&#xff0c;进一步说明了OSPF的强大。RIP最多支持15台路由…

gridview ashx实现数据更新_Python分析了香港26281套在售二手房数据,结果发现

作者&#xff1a;J哥背景香港的贫富差距问题一直十分尖锐&#xff0c;最突出的体现就是收入和楼价的巨大差异。早在60年代末香港房价就经历了暴涨&#xff0c;人们早已对不动产的金融属性了如指掌&#xff0c;全港的投资情绪一直都相当火热。即便香港当前失业率高企&#xff0c…

奇奇seo优化软件_西藏seo关键词优化软件

西藏seoxaa0c1关键词优化软件&#xff0c;网站在建立时搜索引擎是较为完善的基本上是不太需要长期进行优化的&#xff0c;但是近几年搜索引擎优化的频率开始增加&#xff0c;这让人有些好奇&#xff0c;搜索引擎优化的目的是什么&#xff1f;为什么受企业欢迎呢&#xff1f;网站…

c语言出现源文件未编译,dev运行C语言出问题

dev运行时出现源文件未编译的情况是什么原因&#xff0c;应该怎么样解决呢#include int main(){int day,month,year,sum,leap;printf("\n请输入年、月、日&#xff0c;格式为&#xff1a;年,月,日(2015,12,10)\n");scanf("%d,%d,%d",&year,&month,…

lucene自动补全_使用自动机的Lucene新的邻近查询

lucene自动补全最简单的Apache Lucene查询TermQuery匹配包含指定术语的任何文档&#xff0c;无论该术语出现在每个文档中的何处 。 使用BooleanQuery可以将多个TermQuery组合在一起&#xff0c;并完全控制哪些术语是可选的&#xff08; SHOULD &#xff09;和哪些是必需的&…

npm install 报错 汇总_2020年特岗教师招聘征集志愿人员资格复审、面试公告汇总...

原标题&#xff1a;2020年特岗教师招聘征集志愿人员资格复审、面试公告汇总昨天晚上安徽省2020年特岗教师招聘空缺计划征集志愿拟参加面试人员名单已经公布啦&#xff0c;接下来陆续就是资格复审和面试啦小可爱们一点要关注各地复审时间啊2020年特岗教师招聘征集志愿人员资格复…

使用Java和JSF构建一个简单的CRUD应用

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 JavaServer Faces&#xff08;JSF&#xff09;是用于构建Web应用程序的Java框架&#xff0c;其中心是作为用户界面构建…

ftp 传输速度_ftp上传工具下载,8款优秀的ftp上传工具下载软件

FTP上传工具现在有很多种&#xff0c;而且各有各的特点&#xff0c;至于FTP上传工具哪个好用呢&#xff1f;小编认为萝卜白菜各有所爱&#xff0c;看个人喜好&#xff0c;还结合服务器和各种功能方面的需求。小编用的就是iis7服务器管理工具&#xff0c;比较方便而且功能不错&a…

java ee打印功能_Java EE:异步构造和功能

java ee打印功能介绍 Java EE具有许多API和构造以支持异步执行。 从可伸缩性和性能的角度来看&#xff0c;这是至关重要的。 让我们假设2个模块相互交互。 当模块A &#xff08;发送方&#xff09;以同步方式向模块B &#xff08;接收方&#xff09;发送消息时&#xff0c;通信…

驱动备份工具哪个好_大庆seo排名优化推广公司工具哪个好

工具哪个好g81915seo排名优化推广公司大庆,网站成立时&#xff0c;搜索引擎比较完善&#xff0c;基本上不需要长期优化。然而&#xff0c;近年来&#xff0c;搜索引擎优化的频率开始增加&#xff0c;这让人们有点好奇。搜索引擎优化的目的是什么&#xff1f;为什么会受到企业的…

c语言动画原理,动画详解十大经典排序算法(C语言版)

排序算法是程序员必备的基础知识&#xff0c;弄明白它们的原理和实现很有必要。本文中将通过非常细节的动画展示出算法的原理&#xff0c;配合代码更容易理解。概述由于待排序的元素数量不同&#xff0c;使得排序过程中涉及的存储器不同&#xff0c;可将排序方法分为两类&#…

小程序 const moment = require('moment')_C++大作业-XXX管理程序

理工科大一往往会学习C/C&#xff0c;期末会有大作业。这篇文章就是一个简单的C大作业程序。我也是大一&#xff0c;所以觉着哪里写得不好欢迎在评论区提出。程序总体上讲是个“总分总”结构。一 实现这个程序要八步。第一步 程序的功能设计程序的目标有两个。一是辅助我备考四…

电脑机器人_视频|电话积分换平板电脑和扫地机器人?女子拿回家后……-

报警人小王(左二)讲述事情经过。沙坪坝警方供图 华龙网-新重庆客户端 发华龙网-新重庆客户端11月9日11时讯(记者 张勇)“警察叔叔&#xff0c;这个店好坑人哦&#xff0c;我好气愤&#xff01;”11月6日11时许&#xff0c;重庆市沙坪坝区一名年轻女子拨打110报警电话称&#xf…

android自定义弹出对话框,使用FlyDialog实现自定义Android弹窗对话框

前言学习的时候要用到弹窗&#xff0c;但是又觉得i同自带的弹窗样式有点不太美观&#xff0c;搜索资料后发现了FlycoDialog这个开源库,效果很好&#xff0c;而且实现起来也比较方便。先列举一些比较好看的效果:NormalListDialogActionSheetDialog这篇文章主要来讲一下他的自定义…