Gradle-user guide-第8章 依赖管理基础(译)

Gradle依赖管理
本文介绍了Gradle中的依赖管理基础知识,包括依赖与发布的概念、依赖的声明与配置、外部依赖及仓库的使用,以及如何发布产物。

第8章依赖管理基础

这章会介绍一些Gradle中的依赖管理的基础知识。

8.1什么是依赖管理

粗略地说,依赖由两方面组成。第一,Gradle需要知道项目要构建或者执行的东西,以便于可以找到它们,我们把这些项目需要的文件称作项目的依赖。第二,Gradle需要构建和上传项目所生成的东西,我们把生成的文件叫做项目的发布。让我们来在更多细节上看看这两方面。

大多数项目都不是完全独立的。它们需要其他项目构建的文件来被编译、测试等。例如,为了在项目中使用Hibernate ,需要在classpath中加入一些Hibernatejar文件;为了测试项目,需要在test classpath中加入一些额外的jar文件,比如说一个特定的JDBC驱动或者Ehcache JAR文件。 

这些文件就是项目的依赖。Gradle需要你告知它项目的依赖是什么,以便于它可以找到这些依赖,并使这些依赖在项目中是可用的。这些依赖可能需要从远程的Mavenlvy仓库下载,或者是从本地目录加载,或者当在一个多项目构建中时,依赖也可能是被其他项目构建出来的。我们称这个过程为“依赖解决”(dependency resolution)

经常地,项目的依赖本身会存在其他的依赖。举个例子,Hibernate 核心库需要在其classpath中申明依赖一些其他的库,才能够运行。因此,Gradle测试为你的项目执行测试的时候,它需要找到这些依赖,并使它们是可用的。我们称之为过渡依赖transitivedependencies)。

大多数项目的主要目的是构建出一些在本身项目之外的地方可以使用的文件。例如,如果你的项目产生一个java库,那么你需要去构建一个jar文件,可能也会需要去构建一个包含源代码的jar文件,以及一些注视文档,并且在某些地方去发布它们。

这些输出文件组成了项目的发布。Gradle会小心的为你处理这重要的工作,你申明你的项目的发布,Gradle会构建它们并且在发布它们。确切来说,发布(publishing)代表你想要去做的事情。你可能想要将文件拷贝到本地目录,或者是将它们上传到远程的Mavenlvy仓库,或者是你可能在多项目构建中的另一个项目中使用这些文件。我们将这个过程称为发布(publication)。

8.2申明依赖

让我们来看一下依赖的申明。这里有个基础的构建脚本:

例子8.1申明依赖

applyplugin: 'java'
 
repositories{
    mavenCentral()
}
 
dependencies{
    compile group:'org.hibernate',name:'hibernate-core',version:'3.6.7.Final'
    testCompile group:'junit',name:'junit',version:'4.+'
}

这里发生了什么呢?这个构建脚本描述了一些关于项目的内容。首先,申明需要hibernate核心库3.6.7.Final来编译项目代码。隐含地,在运行时需要hibernate核心库的依赖。构建脚本也同时申明依需要一个版本大于等于4.0junit来编译项目的测试代码。构建脚本也告知去Maven中心仓库查找任何依赖。接下里会进行详细的说明。

8.3依赖配置

依赖被分到配置里面,一项配置可以简单地称为一系列的依赖,我们称为依赖配置。你可以用它们申明项目的外部依赖。正如我们稍后将会看到的,它们也被用来申明项目的发布。

Java插件定义了许多标准的配置,这些配置描述了Java插件所使用的类路径(classpaths)。

下面列出了一些依赖配置项。

编译(compile

编译项目源代码所需要的依赖。

运行时(runtime

classes在运行时所需要的依赖,默认包含编译时依赖。

测试编译(testCompile

编译项目测试代码所需要的依赖,默认包含classes和编译时依赖。

测试运行时(testRuntime

执行测试所需要的依赖。默认包含编译、运行时、测试编译依赖。

各种插件添加进一步的标准配置。你也可以定义自定义配置。依赖配置中的定义和定制依赖配置的更多细节参考50.3部分。

8.4外部依赖

有许多类型的依赖是可以被定义的。外部依赖就是其中的一种。这种依赖的对象不在当前的构建项目中,它们在远程仓库或者是本地文件系统的一个目录中。

将如下代码添加到依赖配置中,就可以定义一个外部依赖。

例子8.2外部依赖的定义

dependencies{
   compile group : 'org.hibernate', name: 'hibernate-core', version:'3.6.7.Final'
}

外部依赖定义使用group、name、version属性。根据所使用的库不同,group和version是可选的。

有一种定义外部依赖的快捷方式,使用"group:name:version"格式的字符串。

例子8.3外部依赖的快捷定义

dependencies{
   compile 'org.hibernate:hibernate-core:3.6.7.Final'
}

8.5仓库

Gradle是如何从外部依赖找到文件的呢?Gradle从仓库(repository)中寻找它们。仓库实际上是一堆文件的集合,这些文件通过group、name、version组织分类。Gradle支持很多仓库,比如Maven和Ivy,而且有不同的方式访问仓库,比如本地文件系统和HTTP。

默认地,Gradle没有定义任何仓库,在使用外部依赖之前,你需要定义至少一个仓库。一种选择是使用Maven central仓库。

例子8.4 使用 Maven central仓库

repositories{
   mavenCentral()
}

也可以使用远程的Maven仓库

例子8.5使用远程Maven仓库

repositories{
   maven{
       url "http://repo.mycompany.com/maven2"
    }
}

一个项目可能有多个仓库,Gradle会根据库的定义顺序来依次找到对应的依赖,如果找到了依赖,那么就不会在后面定义的仓库中寻找了。

 

8.6 发布产物

依赖位置也用来发布文件,这些文件被称为发布产物(publishing artifacts),或者通常称为产物(artifacts)。

插件做了一项很好的工作,定义项目的产物。因此你不需要告诉Gradle哪些需要发布。但是,你需要告诉Gradle将产物发布到哪个地方。方法是把库附在uploadArchives任务里。下面是一个发布到远程Ivy仓库的例子:

例子8.8发布到Ivy仓库

uploadArchives {
   repositories {
       ivy {
           credentials {
                username "username"
                password "pw"
           }
            url"http://repo.mycompany.com"
       }
    }
}

现在,当你执行Gradle uploadArchives,Gradle就会构建和上传你的Jar,Gradle也会生成一个Ivy.xml文件,并且也会将它与Jar文件一同上传。

你也可以发布到Maven仓库,语法有一点点不同,因为发布到Maven仓库需要应用Maven插件。这种情况下,Gradle会生成和上传一个pom.xml文件。

例子8.9发布到Maven仓库

apply plugin: 'maven'
 
uploadArchives {
   repositories {
       mavenDeployer {
           repository(url: "file://localhost/tmp/myRepo/")
       }
    }
}

<think>嗯,用户需要查找Gradle 4.5版本的相关信息。用户明确提到了使用指南、下载和问题解决方案这些方面,看来用户可能在处理一个使用较旧Gradle版本的项目,需要兼容性支持。 从提供的引用材料来看,虽然直接关于4.5版本的内容不多,但可以提取几个关键点:引用[3]提到了Android Gradle插件版本与Gradle版本的对应关系,而引用[5]则说明旧版Gradle可能需要特定JDK环境,比如JDK 8。这些都是解决兼容性问题的重要线索。 用户似乎遇到了具体的技术障碍,因为ta特意排除了引用中较新版本的信息。考虑到Gradle 4.5发布于2017年,现在官网可能已不提供官方下载,准备在回答中提供可靠的第三方镜像源,比如Maven Central这样的可信渠道。 关于使用指南部分,由于版本较旧,官方文档可能已被归档。计划引导用户访问web.archive.org的快照链接,这样既能保证资料可靠性,又避免推荐过时内容。对于常见的wrapper配置问题和依赖管理冲突,这些在老版本中尤为常见,需要重点说明解决方案。 注意到引用[5]提到JDK兼容性问题,这确实是很多用户升级时的痛点。准备特别强调Gradle 4.5需要JDK 8这个关键限制,并给出Android Studio的配置路径,因为用户很可能是Android开发者。 用户没有明确是否要升级版本,所以考虑在相关问题里加入版本升级路径的选项,这样既能解决当前需求,又预留了扩展空间。 </think>以下是关于 Gradle 4.5 版本的详细信息整理: --- ### ️ **Gradle 4.5 核心信息** 1. **发布日期** - 2018 年 1 月发布,现已进入维护终止状态(官方不再提供更新)[^3]。 2. **JDK 要求** - **必须使用 JDK 8**(不支持更高版本 JDK)[^5]。 3. **Android 兼容性** - 对应 Android Gradle Plugin 版本为 **3.0.0 - 3.3.x** [^3][^5]。 --- ### ⬇️ **下载资源** | 文件类型 | 下载地址 | |----------------|--------------------------------------------------------------------------| | 二进制分发包 | [gradle-4.5-bin.zip](https://services.gradle.org/distributions/gradle-4.5-bin.zip) | | 完整分发包 | [gradle-4.5-all.zip](https://services.gradle.org/distributions/gradle-4.5-all.zip) | > 💡 *提示:若官网下载缓慢,可尝试镜像站(如 [Maven Central](https://repo.maven.apache.org/maven2/))搜索文件名。* --- ### ⚙️ **配置与使用指南** 1. **环境变量设置** ```bash # Unix/Linux export PATH=$PATH:/opt/gradle-4.5/bin # Windows 系统变量 Path 添加:C:\gradle-4.5\bin ``` 2. **Wrapper 配置(推荐)** 在 `gradle-wrapper.properties` 中指定版本: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-bin.zip ``` --- ### ️ **常见问题解决** 1. **JDK 版本冲突** - **症状**:构建失败提示 `Unsupported major.minor version` - **方案**:检查并切换至 JDK 8(通过 `java -version` 验证)[^5]。 2. **Android 插件兼容性** - 在项目的 `build.gradle` 中需匹配插件版本: ```groovy dependencies { classpath 'com.android.tools.build:gradle:3.3.2' // 最高兼容版本 } ``` 3. **依赖解析失败** - 使用阿里云镜像加速仓库下载(添加至 `build.gradle`): ```groovy repositories { maven { url 'https://maven.aliyun.com/repository/public' } jcenter() } ``` --- ### 📚 **官方文档参考** - **归档文档**:[Gradle 4.5 User Manual](https://docs.gradle.org/4.5/userguide/userguide.html) - **发布说明**:[Release Notes](https://docs.gradle.org/4.5/release-notes.html) --- ### 🔍 **相关问题** 1. Gradle 4.5 与 Gradle 5.x 的主要兼容性差异有哪些? 2. 如何将旧项目从 Gradle 4.5 安全升级到新版本? 3. JDK 8 下运行 Gradle 4.5 遇到 `NoSuchMethodError` 如何解决? > 引证说明: > [^1][^2]: 下载源参考 > [^3][^5]: 版本兼容性与环境配置 > [^4]: 版本发布信息参考
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值