Gradle笔记_3-依赖管理

Gradle笔记_3-依赖管理

《Gradle for Android 中文版》笔记
Gradle文档

build.gradle 文件中添加一行依赖代码,Gradle 将会从远程仓库下载依赖库,项目中就可以使用其中的类了。

3.1 依赖仓库

repositories {
	jcenter()
}
  • Gradle 支持三种不同的依赖仓库:Maven、Ivy 或静态文件或文件夹。
  • 在构建(build)的执行阶段依赖从依赖仓库中被获取出来。
  • Gradle 也有本地缓存,所以一个特定版本的依赖只会在你的机器上下载一次。

一个依赖通常是由三种元素定义:group、name 和 version。

  • group:创建了该依赖库的组织
  • name;依赖库的唯一标识
  • version:版本号,可以确保依赖库不会自动更新,防止构建失败。

例如:

dependencies {
	// group:name:version 标记法
	implementation 'com.squareup.okhttp3:okhttp:4.2.0'
	implementation 'com.squareup.retrofit2:retrofit:2.6.2'
	
	// 映射样式(map-style)标记法
	implementation group: 'com.squareup.picasso', name: 'picasso' version: '2.8'
	implementation group: 'org.greenrobot:greendao' name: 'greendao' version: '3.2.0'
	
	// 声明任意文件作为依赖
	implementation files('hibernate.jar', 'libs/spring.jar')
}

对于一个依赖,唯一需要的字段是 name,group 和 version 可选,为表述清楚,建议加 group,version可以确保依赖库不会自动更新,防止构建失败。

3.1.1 预定义依赖仓库

Gradle 预定义了三个 Maven 仓库:JCenter、Maven Central 和本地 Maven 仓库。
可在构建脚本中添加:

repositories {
	jcenter()
	mavenCentral()
	mavenLocal()
}
  • Maven Central 和 JCenter 是两个有名的远程仓库,一般不同时使用,建议使用 JCenter,其也是 Android Studio 创建 Android 项目时的默认依赖仓库。JCenter 不同于 Maven Central,它还支持 HTTPS。
  • 本地 Maven 仓库是你已经是用了的所有依赖的本地缓存,你也可以自己添加依赖。路径:.gradle\caches\modules-2
  • 除了这些预定义的一来仓库,还可以添加其他公有设置私有仓库。
3.1.2 远程仓库

有些插件或依赖库放在自有的 Maven 或 Ivy 服务器上,而不是发布到 Maven Central 或 JCenter。在构建中添加这些依赖,需要在 Maven 代码块中添加 URL:

repositories {
	maven {
		url "http://maven.aliyun.com/nexus/content/repositories/releases"
	}
	ivy {
		url 'http://repo.acmecorp.com/repo'
	}
	
	// 带凭证
	marven {
		url "http://repo.acmecorp.com/maven2"
		credentials {
			username 'user'
			password 'secretpassword'
		}
	}
}

不建议在构建配置文件中存储你的凭证。更好的方法是使用一个单独的 Gradle 属性文件。

3.1.3 本地仓库

添加本地仓库,只需配置一个相对或绝对路径的 URL 即可:

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

新的 Android 项目默认情况下有一个 Android Support Library 的依赖。当使用SDK Manager 来安装 Google 仓库时,在硬件驱动器上,会创建两个 Maven 仓库:ANDROID_SDK/extras/google/m2repository 和 ANDROID_SDK/extras/android/m2repository。Gradle 通过它们获取谷歌提供的依赖包,例如 Android Support LIbrary 和 Google Play Services。

也可以通过 flatDir 添加一个常用的文件夹作为仓库:

repositories {
	flatDir {
		dirs 'arrs'
	}
}

3.2 本地依赖

在某些情况下,可能仍需要手动下载 JAR 文件或原生库。比如自己的依赖库,没有发布到公有或私有仓库,就可以生成 jar 文件,在多个项目中使用。

3.2.1 文件依赖

Gradle 中添加文件依赖:

dependencies {
	implementation files('libs/pinyin4j-2.5.0.jar')
}

当有多个 JAR 文件,一次添加一个完整的文件夹更简单些:

dependencies {
	implementation fileTree('libs')
}

Android 项目一般会有一个 libs 文件夹,会被声明为依赖使用的文件夹。一个过滤器可以保证只有 JAR 文件会被依赖,而不是简单地依赖文件夹中所有的文件:

dependencies {
	implementation fileTree(dir: 'libs', include: ['*.jar'])
	// 一般 .aar 文件也是需要被依赖的。
	// implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}

可以将 JAR 文件放在 libs 文件夹中,其会自动包含在构建路径和最终的 APK 中。

3.2.2 原生依赖

用 C 或 C++ 编写的依赖库可以被便以为特定平台的原生代码。这些依赖库通常包含几个 .so 文件,可用于所有平台。
Andorid 插件默认支持原生依赖库,需要在模块层创建一个 jniLibs 文件夹,然后为每个平台创建爱你子文件夹,将 .so 文件放在适当的文件夹中。

app/main/

  • jniLibs
    • arm64-v8a
      • libandroidlame.so
    • armeabi
      • libandroidlame.so
    • armeabi-v7a
      • libandroidlame.so
    • mips
      • libandroidlame.so
    • mips64
      • libandroidlame.so
    • x86
      • libandroidlame.so
    • x86_64
      • libandroidlame.so

如果文件放在 libs 下,需要在构建文件中添加

android {
	sourceSets {
		main {
			// jniLibs.srcDirs = ['src/main/jniLibs'] // 默认
			jniLibs.srcDirs = ['libs'] // 如果文件放在 libs
		}
	}
}
3.2.3 依赖项目

依赖项目和通常的应用项目类似。

  • 你可以使用相同的任务来构建和测试依赖项目,并且它们可以有不同的构建 variants(变量,变体,变式)。
  • 应用项目将生成一个可被安装和运行在 Android 设备上的 APK;依赖项目则生成一个 .aar 文件,该文件可被 Android 应用项目用作依赖库。

1. 创建和使用依赖项目模块

不同于 Android 应用的插件(com.android.application),构建脚本需要应用 Android 依赖库插件:

apply plugin: 'com.android.library'

在应用中包含(include)依赖项目的方式有两种,一种是在项目中当作一个模块(module),另一种是生成一个可在多个应用复用的 .aar 文件。

如果在项目中创建类一个模块(module)作为依赖项目,需要在 settings.gradle 中添加该模块:

include ':app', ":library"

在应用模块或其他模块中将它作为依赖:

implementation project(path: ':library')

2. 使用 .aar 文件

如果你创建了一个依赖库,并且想在不同的 Android 应用中复用,那么你可以创建一个 .aar 文件,然后将其作为一个依赖添加到项目中。

在构建依赖库时,模块目录下的 build/output/aar/ 文件夹将会生成 .aar 文件。

需要在应用模块中添加一个文件夹 aars,复制 .aar 文件至该文件夹,并添加该文件夹作为依赖仓库:

repositories {
	flatDir {
		dirs 'arrs'
	}
}

在应用模块中添加依赖:

dependencies {
	implementation(name: 'libraryname', ext: 'aar')
}

其告知 Gradle 查找具有特定名称且扩展名为 .aar 的依赖库。

3.3 依赖概念

3.3.1 配置

原来是 compile,现在是 implementation,二者有所区别。使用 compile 依赖会传递,使用 implementation 不会传递。A compile B,B compile C, 则 A compile C,但是,A implementation B,B Implementation C,A 不会 implementation C,A如果需要 依赖 C,则让 A implementation C。要想使依赖可以传递,使用 api, 使 B api C。
implementation 更好一些,能减少不必要的依赖关系。而且 compile 已过时。

下面是一个 Android 应用或依赖库的标准配置:

  • implementation:是默认配置,在编译主应用时包含所有的依赖。该配置不仅会将依赖添加至类路径(class path),还会打包到 APK。
  • apk:该依赖只会被打包到 APK,而不会添加到编译类路径。只适用于 jar 依赖。
  • provided:与 apk 完全相反,依赖不会被打包到 APK。只适用于 jar 依赖。
  • testImplementation:用于测试,不会打包到 APK。
  • androidTestImplementation:用于测试,不会打包到 APK。

除了上面标准配置外,Android 插件还针对每个构建 variant 都生成了一份配置,使其添加依赖配置化成为可能,例如,debugImplementationreleaseImplementation 等。当你只想在 debug 构建中添加 logging 框架时,这会非常有用。

3.3.2 语义化版本

将依赖添加到 JCenter 等仓库时,约定遵循了一套版本化规则,语义化版本。
版本数字一般为 major.minor.patch,数字按照以下规则依次增加:

  • 当做不兼容的Api变化时,major 版本增加。
  • 当以向后兼容的方式添加功能时,minor 版本增加。
  • 当修复一些 bug 时,patch 版本增加。
3.3.3 动态化版本

在某些情况下,你可能希望在每次构建应用或依赖库时,都能够获取到最新的依赖。最好的实现方式是使用动态化版本:

dependencies {
    implementation 'com.google.android.material:material:1.2.+'
    implementation 'androidx.recyclerview:recyclerview:1.1+'
    implementation 'androidx.constraintlayout:constraintlayout:+'
}

第一行,告知 Gradle 获取最新的 patch 版本。

第二行,我们希望获取每一个 minor 版本,且 minor 版本至少是 1。

最后一行,我们告知 Gradle 获取依赖库的最新版本。

注意:如果允许 Gradle 获取最新版本,则很可能 Gradle 获取的依赖版本并不稳定,它可能会导致构建中断。
当你试图在构建文件中使用动态化版本,Android Studio 将会警告你可能存在的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
About This Book, Create custom Gradle tasks and plugins for your Android projects, Configure different build variants, each with their own dependencies and properties, Manage multi-module projects, and integrate modules interdependently, Who This Book Is For, If you are an experienced Android developer wanting to enhance your skills with the Gradle Android build system, then this book is for you. As a prerequisite, you will need some knowledge of the concepts of Android application development., What You Will Learn, Build new Android apps and libraries using Android Studio and Gradle, Migrate projects from Eclipse to Android Studio and Gradle, Manage the local and remote dependencies of your projects, Create multiple build variants, Include multiple modules in a single project, Integrate tests into the build process, Create custom tasks and plugins for Android projects, In Detail, Gradle is an open source build automation system that introduces a Groovy-based domain-specific language (DSL) to configure projects. Using Gradle makes it easy for Android developers to manage dependencies and set up the entire build process., This book begins by taking you through the basics of Gradle and how it works with Android Studio. Furthermore, you will learn how to add local and remote dependencies to your project. You will work with build variants, such as debug and release, paid and free, and even combinations of these things. The book will also help you set up unit and integration testing with different libraries and will show how Gradle and Android Studio can make running tests easier. Finally, you will be shown a number of tips and tricks on the advanced customization of your application's build process. By the end of this book, you will be able to customize the entire build process, and create your own tasks and plugins for your Gradle builds.
在 Kafka 中,Producer 是用来发送消息到 Kafka 集群的组件。在本篇文章中,我们将介绍如何使用 Kafka 的 Java 客户端 API 来编写一个简单的 Producer。 1. 引入 Kafka 依赖 首先,需要在 Maven 或 Gradle 构建中引入 Kafka 客户端依赖: ```xml <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.8.0</version> </dependency> ``` 2. 创建 Producer 实例 接下来,在 Java 代码中创建一个 KafkaProducer 实例: ```java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); ``` 其中,bootstrap.servers 是必须设置的属性,用于指定 Kafka 集群中至少一个 Broker 的地址。key.serializer 和 value.serializer 用于指定消息的键和值的序列化器。这里我们使用的是 StringSerializer,也可以使用其他序列化器实现自定义序列化逻辑。 3. 发送消息 一旦创建了 KafkaProducer 实例,就可以使用它来发送消息到指定的 Kafka 主题: ```java ProducerRecord<String, String> record = new ProducerRecord<>("test-topic", "key", "value"); producer.send(record); ``` 这里的 ProducerRecord 构造函数中,第一个参数是要发送消息的主题名称,第二个参数是消息的键,第三个参数是消息的值。send() 方法用于将 ProducerRecord 发送到 Kafka 集群。 4. 关闭 Producer 在使用完 Producer 后,需要关闭它以释放资源: ```java producer.close(); ``` 完整代码示例: ```java import org.apache.kafka.clients.producer.*; import java.util.Properties; public class KafkaProducerExample { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); ProducerRecord<String, String> record = new ProducerRecord<>("test-topic", "key", "value"); producer.send(record); producer.close(); } } ``` 这就是一个简单的 Kafka Producer 的使用示例。在实际应用中,还可以根据需要设置其他属性,例如消息的分区策略、消息的压缩方式等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值