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