gradle引入依赖:_Gradle入门:依赖管理
gradle引入依賴:
即使不是沒有可能,創(chuàng)建沒有任何外部依賴關(guān)系的現(xiàn)實(shí)應(yīng)用程序也是一項(xiàng)挑戰(zhàn)。 這就是為什么依賴性管理是每個(gè)軟件項(xiàng)目中至關(guān)重要的部分的原因。
這篇博客文章描述了我們?nèi)绾问褂肎radle管理項(xiàng)目的依賴關(guān)系。 我們將學(xué)習(xí)配置已使用的存儲(chǔ)庫和所需的依賴項(xiàng)。 我們還將通過實(shí)現(xiàn)一個(gè)簡(jiǎn)單的示例應(yīng)用程序?qū)⒋死碚搼?yīng)用于實(shí)踐。
讓我們開始吧。
補(bǔ)充閱讀:
- Gradle入門:簡(jiǎn)介可幫助您安裝Gradle,描述Gradle構(gòu)建的基本概念,并描述如何使用Gradle插件向構(gòu)建中添加功能。
- Gradle入門:我們的第一個(gè)Java項(xiàng)目描述了如何使用Gradle創(chuàng)建Java項(xiàng)目并將應(yīng)用程序打包到可執(zhí)行jar文件中。
儲(chǔ)存庫管理簡(jiǎn)介
存儲(chǔ)庫實(shí)質(zhì)上是依賴項(xiàng)容器,每個(gè)項(xiàng)目可以使用零個(gè)或多個(gè)存儲(chǔ)庫。
Gradle支持以下存儲(chǔ)庫格式:
- 常春藤倉庫
- Maven倉庫
- 平面目錄存儲(chǔ)庫
讓我們了解如何在構(gòu)建中配置每種存儲(chǔ)庫類型。
將常春藤存儲(chǔ)庫添加到我們的構(gòu)建中
我們可以使用它的url地址或它在本地文件系統(tǒng)中的位置將Ivy存儲(chǔ)庫添加到我們的構(gòu)建中。
如果我們想使用其URL地址添加一個(gè)Ivy存儲(chǔ)庫,則必須將以下代碼片段添加到build.gradle文件中:
repositories {ivy {url "http://ivy.petrikainulainen.net/repo"} }如果要使用文件系統(tǒng)中的位置添加常春藤存儲(chǔ)庫,則必須將以下代碼片段添加到build.gradle文件中:
repositories {ivy { url "../ivy-repo"} }如果要獲取有關(guān)配置Ivy存儲(chǔ)庫的更多信息,則應(yīng)檢查以下資源:
- Gradle用戶指南的第50.6.6節(jié)Ivy存儲(chǔ)庫
- IvyArtifactRepository的API文檔
讓我們繼續(xù)前進(jìn),了解如何將Maven存儲(chǔ)庫添加到我們的構(gòu)建中。
將Maven存儲(chǔ)庫添加到我們的構(gòu)建中
我們可以使用其URL地址或在本地文件系統(tǒng)中的位置將Maven存儲(chǔ)庫添加到我們的構(gòu)建中。
如果要使用其URL添加Maven存儲(chǔ)庫,則必須將以下代碼片段添加到build.gradle文件中:
repositories {maven {url "http://maven.petrikainulainen.net/repo"} }如果要使用文件系統(tǒng)中的Maven存儲(chǔ)庫來添加Maven存儲(chǔ)庫,則必須將以下代碼段添加到build.gradle文件中:
repositories {maven { url "../maven-repo"} }在將Maven存儲(chǔ)庫添加到構(gòu)建中時(shí),Gradle可以使用三個(gè)“別名”。 這些別名是:
- mavenCentral()別名意味著從中央Maven 2存儲(chǔ)庫中獲取依賴項(xiàng)。
- jcenter()別名意味著從Bintray的JCenter Maven存儲(chǔ)庫中獲取依賴項(xiàng)。
- mavenLocal()別名意味著從本地Maven存儲(chǔ)庫中獲取依賴項(xiàng)。
如果要在構(gòu)建中添加中央Maven 2存儲(chǔ)庫,則必須將以下代碼段添加到build.gradle文件中:
repositories {mavenCentral() }如果要獲取有關(guān)配置Maven存儲(chǔ)庫的更多信息,則應(yīng)查閱Gradle用戶指南的第50.6.4節(jié)“ Maven存儲(chǔ)庫” 。
讓我們繼續(xù)前進(jìn),了解如何向構(gòu)建中添加平面目錄存儲(chǔ)庫。
將平面目錄存儲(chǔ)庫添加到我們的版本中
如果要使用平面目錄存儲(chǔ)庫,則必須將以下代碼片段添加到build.gradle文件中:
repositories {flatDir {dirs 'lib'} }這意味著從lib目錄中搜索依賴項(xiàng)。 另外,如果需要,可以通過將以下代碼段添加到build.gradle文件中來使用多個(gè)目錄:
repositories {flatDir {dirs 'libA', 'libB'} }如果要獲取有關(guān)平面目錄存儲(chǔ)庫的更多信息,則應(yīng)檢查以下資源:
- Gradle用戶指南的第50.6.5節(jié)平面目錄存儲(chǔ)庫
- Flat Dir Repository發(fā)布到gradle用戶郵件列表
讓我們繼續(xù)前進(jìn),了解如何使用Gradle管理項(xiàng)目的依賴關(guān)系。
依賴管理簡(jiǎn)介
配置項(xiàng)目的存儲(chǔ)庫后,我們可以聲明其依賴項(xiàng)。 如果我們要聲明一個(gè)新的依賴關(guān)系,我們必須執(zhí)行以下步驟:
讓我們仔細(xì)看看這些步驟。
將依賴項(xiàng)分組到配置中
在Gradle中,依賴項(xiàng)被分組為一組命名的依賴項(xiàng)。 這些組稱為配置,我們使用它們來聲明項(xiàng)目的外部依賴關(guān)系。
Java插件指定了幾種依賴項(xiàng)配置 ,下面對(duì)此進(jìn)行了描述:
- 當(dāng)我們編譯項(xiàng)目的源代碼時(shí),需要將添加到編譯配置的依賴項(xiàng)。
- 運(yùn)行時(shí)配置包含運(yùn)行時(shí)所需的依賴項(xiàng)。 此配置包含添加到編譯配置的依賴項(xiàng)。
- testCompile配置包含編譯項(xiàng)目測(cè)試所需的依賴項(xiàng)。 此配置包含項(xiàng)目的已編譯類以及添加到編譯配置中的依賴項(xiàng)。
- testRuntime配置包含運(yùn)行我們的測(cè)試時(shí)所需的依賴項(xiàng)。 此配置包含添加到compile , runtime和testCompile配置的依賴項(xiàng)。
- 檔案配置包含我們項(xiàng)目產(chǎn)生的工件(例如Jar文件)。
- 默認(rèn)配置組包含運(yùn)行時(shí)所需的依賴項(xiàng)。
讓我們繼續(xù)前進(jìn),找出如何聲明Gradle項(xiàng)目的依賴項(xiàng)。
聲明項(xiàng)目的依存關(guān)系
最常見的依賴項(xiàng)稱為外部依賴項(xiàng),可從外部存儲(chǔ)庫中找到。 通過使用以下屬性來標(biāo)識(shí)外部依賴項(xiàng):
- group屬性標(biāo)識(shí)依賴項(xiàng)的組(Maven用戶將此屬性稱為groupId )。
- name屬性標(biāo)識(shí)依賴項(xiàng)的名稱(Maven用戶將此屬性稱為artifactId )。
- version屬性指定外部依賴項(xiàng)的版本(Maven用戶將此屬性稱為version )。
使用Maven存儲(chǔ)庫時(shí),這些屬性是必需的。 如果使用其他存儲(chǔ)庫,則某些屬性可能是可選的。
例如,如果使用平面目錄存儲(chǔ)庫,則可能必須僅指定name和version 。
假設(shè)我們必須聲明以下依賴關(guān)系:
- 依賴項(xiàng)的組為“ foo”。
- 依賴項(xiàng)的名稱為“ foo”。
- 依賴項(xiàng)的版本為0.1。
- 編譯我們的項(xiàng)目時(shí)需要依賴項(xiàng)。
我們可以通過將以下代碼片段添加到build.gradle文件中來聲明此依賴性:
dependencies {compile group: 'foo', name: 'foo', version: '0.1' }我們還可以使用遵循以下語法的快捷方式形式聲明項(xiàng)目的依賴項(xiàng): [group]:[name]:[version] 。 如果要使用快捷方式表單,則必須將以下代碼片段添加到build.gradle文件中:
dependencies {compile 'foo:foo:0.1' }我們還可以將多個(gè)依賴項(xiàng)添加到同一配置中。 如果要在聲明依賴項(xiàng)時(shí)使用“常規(guī)”語法,則必須將以下代碼片段添加到build.gradle文件中:
dependencies {compile ([group: 'foo', name: 'foo', version: '0.1'],[group: 'bar', name: 'bar', version: '0.1']) }另一方面,如果我們要使用快捷方式表單, build.gradle文件的相關(guān)部分如下所示:
dependencies {compile 'foo:foo:0.1', 'bar:bar:0.1' }自然可以聲明屬于不同配置的依賴項(xiàng)。 例如,如果我們要聲明屬于compile和testCompile配置的依賴項(xiàng),則必須向build.gradle文件中添加以下代碼片段:
dependencies {compile group: 'foo', name: 'foo', version: '0.1'testCompile group: 'test', name: 'test', version: '0.1' }同樣,可以使用快捷方式表格。 如果要使用快捷方式表單聲明相同的依賴項(xiàng),則build.gradle文件的相關(guān)部分如下所示:
dependencies {compile 'foo:foo:0.1'testCompile 'test:test:0.1' }您可以通過閱讀50.4如何在Gradle用戶指南中聲明依賴項(xiàng)來獲取有關(guān)聲明依賴項(xiàng)的更多信息。
現(xiàn)在,我們已經(jīng)學(xué)習(xí)了依賴管理的基礎(chǔ)知識(shí)。 讓我們繼續(xù)并實(shí)現(xiàn)示例應(yīng)用程序。
創(chuàng)建示例應(yīng)用程序
以下是我們的示例應(yīng)用程序的要求:
- 示例應(yīng)用程序的構(gòu)建腳本必須使用Maven中央存儲(chǔ)庫。
- 示例應(yīng)用程序必須使用Log4j將接收到的消息寫入日志。
- 示例應(yīng)用程序必須包含單元測(cè)試,以確保返回正確的消息。 這些單元測(cè)試必須使用JUnit編寫。
- 我們的構(gòu)建腳本必須創(chuàng)建一個(gè)可執(zhí)行的jar文件。
讓我們找出如何滿足這些要求。
配置我們的版本庫
示例應(yīng)用程序的要求之一是其構(gòu)建腳本必須使用Maven中央存儲(chǔ)庫。 在配置好構(gòu)建腳本以使用Maven中央存儲(chǔ)庫之后,其源代碼如下所示(相關(guān)部分已突出顯示):
apply plugin: 'java'repositories {mavenCentral() }jar {manifest {attributes 'Main-Class': 'net.petrikainulainen.gradle.HelloWorld'} }讓我們繼續(xù)并聲明示例應(yīng)用程序的依賴項(xiàng)。
聲明示例應(yīng)用程序的依賴關(guān)系
我們必須在build.gradle文件中聲明兩個(gè)依賴項(xiàng) :
聲明這些依賴關(guān)系后, build.gradle文件如下所示(相關(guān)部分突出顯示):
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'} }讓我們繼續(xù)寫一些代碼。
編寫代碼
為了滿足示例應(yīng)用程序的要求,“我們必須對(duì)其進(jìn)行過度設(shè)計(jì)”。 我們可以按照以下步驟創(chuàng)建示例應(yīng)用程序:
讓我們一步一步地完成這些步驟。
首先 ,我們必須在src / main / java / net / petrikainulainen / gradle目錄中創(chuàng)建一個(gè)MessageService類并實(shí)現(xiàn)它。 完成此操作后,其源代碼如下所示:
package net.petrikainulainen.gradle;public class MessageService {public String getMessage() {return "Hello World!";} }其次 ,我們?cè)趕rc / main / test / net / petrikainulainen / gradle目錄中創(chuàng)建了一個(gè)MessageServiceTest ,并將單元測(cè)試寫入了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());} }第三 ,我們?cè)趕rc / main / java / net / petrikainulainen / gradle目錄中創(chuàng)建了一個(gè)HelloWorld類。 此類是我們應(yīng)用程序的主要類別。 它從MessageService對(duì)象獲取消息,然后使用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這就對(duì)了。 讓我們找出如何運(yùn)行示例應(yīng)用程序的測(cè)試。
運(yùn)行單元測(cè)試
我們可以使用以下命令運(yùn)行單元測(cè)試:
gradle test測(cè)試通過后,我們將看到以下輸出:
> gradle test :compileJava :processResources :classes :compileTestJava :processTestResources :testClasses :testBUILD SUCCESSFULTotal time: 4.678 secs但是,如果我們的單元測(cè)試失敗,則會(huì)看到以下輸出(突出顯示了有趣的部分):
> 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如我們所見,如果我們的單元測(cè)試失敗,則描述:
- 哪些測(cè)試失敗。
- 運(yùn)行了多少測(cè)試,失敗了多少測(cè)試。
- 測(cè)試報(bào)告的位置,該報(bào)告提供有關(guān)失敗(和通過)測(cè)試的其他信息。
當(dāng)我們運(yùn)行單元測(cè)試時(shí),Gradle將測(cè)試報(bào)告創(chuàng)建到以下目錄:
- build / test-results目錄包含每個(gè)測(cè)試運(yùn)行的原始數(shù)據(jù)。
- build / reports / tests目錄包含一個(gè)HTML報(bào)告,該報(bào)告描述了我們的測(cè)試結(jié)果。
HTML測(cè)試報(bào)告是非常有用的工具,因?yàn)?strong>它描述了測(cè)試失敗的原因 。 例如,如果我們的單元測(cè)試期望MessageService類的getMessage()方法返回字符串“ Hello Worl1d!”,則該測(cè)試用例HTML測(cè)試報(bào)告將如下所示:
讓我們繼續(xù)前進(jìn),了解如何打包和運(yùn)行示例應(yīng)用程序。
打包并運(yùn)行我們的示例應(yīng)用程序
我們可以使用以下命令之一打包應(yīng)用程序:em> gradle assembly或gradle build 。 這兩個(gè)命令都會(huì)在build / libs目錄中創(chuàng)建dependency-management.jar文件。
通過使用命令java -jardependency-management.jar運(yùn)行示例應(yīng)用程序時(shí),我們看到以下輸出:
> 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發(fā)生此異常的原因是,當(dāng)我們運(yùn)行應(yīng)用程序時(shí),從類路徑中找不到Log4j依賴項(xiàng)。
解決此問題的最簡(jiǎn)單方法是創(chuàng)建一個(gè)所謂的“胖” jar文件。 這意味著我們會(huì)將所需的依賴項(xiàng)打包到創(chuàng)建的jar文件中。
在遵循Gradle Cookbook中給出的說明之后,我們的構(gòu)建腳本如下所示(相關(guān)部分已突出顯示):
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'} }現(xiàn)在,我們可以運(yùn)行示例應(yīng)用程序(打包后),并且可以看到一切正常:
> java -jar dependency-management.jar INFO - HelloWorld - Received message: Hello World!今天就這些。 讓我們總結(jié)一下我們從此博客文章中學(xué)到的知識(shí)。
摘要
這篇博客文章教會(huì)了我們四件事:
- 我們學(xué)習(xí)了如何配置構(gòu)建所使用的存儲(chǔ)庫。
- 我們了解了如何聲明所需的依賴關(guān)系并將這些依賴關(guān)系分組為配置。
- 我們了解到,Gradle在運(yùn)行測(cè)試時(shí)會(huì)創(chuàng)建HTML測(cè)試報(bào)告。
- 我們學(xué)習(xí)了如何創(chuàng)建一個(gè)所謂的“胖” jar文件。
如果您想玩這個(gè)博客文章的示例應(yīng)用程序,可以從Github獲得 。
翻譯自: https://www.javacodegeeks.com/2014/07/getting-started-with-gradle-dependency-management.html
gradle引入依賴:
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的gradle引入依赖:_Gradle入门:依赖管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 000开头的是什么股票 000开头的是哪
- 下一篇: CUBA平台:TypeScript SD
