Gradle入门:依赖管理
即使不是沒有可能,創建沒有任何外部依賴關系的現實應用程序也是一項挑戰。 這就是為什么依賴性管理是每個軟件項目中至關重要的部分的原因。
這篇博客文章描述了我們如何使用Gradle管理項目的依賴關系。 我們將學習配置已使用的存儲庫和所需的依賴項。 我們還將通過實現一個簡單的示例應用程序將此理論應用于實踐。
讓我們開始吧。
補充閱讀:
- Gradle入門:簡介可幫助您安裝Gradle,描述Gradle構建的基本概念,并描述如何使用Gradle插件向構建中添加功能。
- Gradle入門:我們的第一個Java項目描述了如何使用Gradle創建Java項目并將應用程序打包到可執行jar文件中。
儲存庫管理簡介
存儲庫本質上是依賴項容器,每個項目可以使用零個或多個存儲庫。
Gradle支持以下存儲庫格式:
- 常春藤倉庫
- Maven倉庫
- 平面目錄存儲庫
讓我們了解如何在構建中配置每種存儲庫類型。
將常春藤存儲庫添加到我們的構建中
我們可以使用它的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管理項目的依賴關系。
依賴管理簡介
配置項目的存儲庫后,我們可以聲明其依賴項。 如果我們要聲明一個新的依賴關系,我們必須執行以下步驟:
讓我們仔細看看這些步驟。
將依賴項分組到配置中
在Gradle中,依賴項分為一組命名的依賴項。 這些組稱為配置,我們使用它們來聲明項目的外部依賴關系。
Java插件指定了幾種依賴項配置 ,下面對此進行了描述:
- 當我們編譯項目的源代碼時,需要將添加到編譯配置的依賴項。
- 運行時配置包含運行時所需的依賴項。 此配置包含添加到編譯配置的依賴項。
- testCompile配置包含編譯項目測試所需的依賴項。 此配置包含我們項目的已編譯類以及添加到編譯配置中的依賴項。
- testRuntime配置包含運行我們的測試時所需的依賴項。 此配置包含添加到compile , runtime和testCompile配置的依賴項。
- 檔案配置包含由我們的項目產生的工件(例如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' }自然可以聲明屬于不同配置的依賴項。 例如,如果我們要聲明屬于compile和testCompile配置的依賴項,則必須將以下代碼片段添加到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文件中聲明兩個依賴項 :
聲明這些依賴關系后, 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'} }讓我們繼續寫一些代碼。
編寫代碼
為了滿足示例應用程序的要求,“我們必須對其進行過度設計”。 我們可以按照以下步驟創建示例應用程序:
讓我們一步一步地完成這些步驟。
首先 ,我們必須在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入门:依赖管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输入法切换方法步骤详解电脑如何更换输入法
- 下一篇: 使用Zapier将应用程序与Neo4j集