gradle--build.gradle

水深无声 2023-02-20 12:20 68阅读 0赞

原文网址:gradle—build.gradle_IT利刃出鞘的博客-CSDN博客

其他网址

gradle的build.gradle详解_霓虹深处-CSDN博客_build.gradle

Gradle 教程_w3cschool(不带子目录)

Gradle User Guide 中文版(带子目录) (英文版:Gradle User Manual)

Gradle DSL Version 6.5(Gradle英文文档)

概述

一个项目中只放置一个build.gradle,一个项目代表一个组件(jar/war包),构建启动后Gradle会根据build.gradle实例化一个org.gradle.api.Project类,提供了对一个项目的基本配置。

示例(一个完整的构建脚本)

  1. apply plugin: 'java'
  2. apply plugin: 'eclipse'
  3. sourceCompatibility = 1.5
  4. version = '1.0'
  5. jar {
  6. manifest {
  7. attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
  8. }
  9. }
  10. repositories {
  11. mavenCentral()
  12. }
  13. dependencies {
  14. compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
  15. testCompile group: 'junit', name: 'junit', version: '4.+'
  16. }
  17. test {
  18. systemProperties 'property': 'value'
  19. }
  20. uploadArchives {
  21. repositories {
  22. flatDir {
  23. dirs 'repos'
  24. }
  25. }
  26. }

属性












































属性名称 所属 说明
group project
version project 项目版本(全局的)
name(artifact) project 一般写在settings.gradle
sourceCompatibility = 1.8 java插件
targetCompatibility = 1.8 java插件
compileJava.options.encoding = ‘UTF-8’ 
compileTestJava.options.encoding = ‘UTF-8’ 

方法




































方法 说明
apply 应用
repositories 添加仓库
dependencies 添加依赖
buildscript
allprojects
subprojects
configurations

repositories{}

简介

repositories是project一个方法,闭包作为参数。若前边的仓库中找不到,再依次在下边的仓库中查找。

  1. repositories {
  2. // 本地仓库,地址是maven本地仓库路径。不用写,默认先找本地仓库的。
  3. // mavenLocal()
  4. //maven私服,此处设置为ali的,地址是url
  5. maven{ url "https://maven.aliyun.com/repository/public/" }
  6. //远程仓库,地址是https://repo1.maven.org/maven2
  7. mavenCentral()
  8. }

上边的mavenLocal对应maven的本地仓库,maven私服对应internal repository,mavenCentral()对应中央仓库,与maven一模一样,直接看这篇即可:maven系列—镜像/仓库_feiying0canglang的博客-CSDN博客

gradle的版本与http

gradle7.0及之后,url最好是安全协议,比如https,上边的http会报警告,解决方法

  1. maven{ url "http://maven.aliyun.com/nexus/content/groups/public" allowInsecureProtocol = true}

修改仓库地址

Gradle、maven默认从中央仓库mavenCentral() 也就是 http://repo1.maven.org/maven2/下载依赖包,但是在国内下载速度巨慢,我们只能使用国内的镜像。

法1:全局配置

配置一个全局配置文件可以只配置一次。如果个别项目需要另外添加仓库地址,只需要在影响的项目下单独配置build.gradle文件增加repositories{}即可。
下边将利用 阿里云开源镜像站 替换掉网络访问困难的 maven、jcenter。

.grable/init.grable

  1. allprojects {
  2. repositories {
  3. def ALIYUN_REPO_NEW = 'https://maven.aliyun.com/repository/public'
  4. def ALIYUN_REPO_OLD = 'http://maven.aliyun.com/nexus/content/groups/public/'
  5. all { ArtifactRepository repo ->
  6. if (repo instanceof MavenArtifactRepository) {
  7. def url = repo.url.toString()
  8. if (url.startsWith('https://repo.maven.apache.org/maven2/')
  9. || url.startsWith('https://repo.maven.org/maven2')
  10. || url.startsWith('https://repo1.maven.org/maven2')
  11. || url.startsWith('https://jcenter.bintray.com/')){
  12. //必须用双引号,不能用单引号
  13. project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPO_NEW."
  14. remove repo
  15. }
  16. }
  17. }
  18. maven {
  19. url ALIYUN_REPO_NEW
  20. url ALIYUN_REPO_OLD
  21. }
  22. }
  23. buildscript {
  24. repositories {
  25. def ALIYUN_REPO_NEW = 'https://maven.aliyun.com/repository/public'
  26. def ALIYUN_REPO_OLD = 'http://maven.aliyun.com/nexus/content/groups/public/'
  27. all { ArtifactRepository repo ->
  28. if (repo instanceof MavenArtifactRepository) {
  29. def url = repo.url.toString()
  30. if (url.startsWith('https://repo.maven.apache.org/maven2/')
  31. || url.startsWith('https://repo.maven.org/maven2')
  32. || url.startsWith('https://repo1.maven.org/maven2')
  33. || url.startsWith('https://jcenter.bintray.com/')) {
  34. //必须用双引号,不能用单引号
  35. project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPO_NEW."
  36. remove repo
  37. }
  38. }
  39. }
  40. maven {
  41. url ALIYUN_REPO_NEW
  42. url ALIYUN_REPO_OLD
  43. }
  44. }
  45. }
  46. }

法2:每个项目单独配置

每个Gradle构建的项目中,在build.gradle做如下配置

  1. repositories {
  2. //本地仓库,地址是maven本地仓库路径
  3. mavenLocal()
  4. //maven私服。此处设置为ali的旧库,地址是url
  5. maven{ url "http://maven.aliyun.com/nexus/content/groups/public" }
  6. //阿里云新库
  7. maven { url "https://maven.aliyun.com/repository/central" }
  8. maven { url "https://maven.aliyun.com/repository/google" }
  9. maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
  10. maven { url "https://maven.aliyun.com/repository/jcenter" }
  11. maven { url "https://maven.aliyun.com/repository/spring" }
  12. maven { url "https://maven.aliyun.com/repository/spring-plugin" }
  13. maven { url "https://maven.aliyun.com/repository/public" }
  14. maven { url "https://maven.aliyun.com/repository/releases" }
  15. maven { url "https://maven.aliyun.com/repository/snapshots" }
  16. maven { url "https://maven.aliyun.com/repository/grails-core" }
  17. maven { url "https://maven.aliyun.com/repository/mapr-public" }
  18. maven { url "https://maven.aliyun.com/repository/apache-snapshots" }
  19. //maven的里程碑版本。有些依赖只能在这里边找到
  20. maven { url "https://repo.spring.io/milestone" }
  21. maven { url 'https://repo.spring.io/libs-milestone' }
  22. //远程仓库,地址是https://repo1.maven.org/maven2
  23. mavenCentral()
  24. }

不同位置repositories的作用




















不同位置的代码示例 说明

build.gradle

repositories {

}

dependencies {

}

根级别的repositories主要是为了当前项目提供所需依赖包,比如log4j、spring-core等依赖包可从mavenCentral仓库获得。

build.gradle

buildscript {
    repositories {
    …
    }

    dependencies {
    …
    }

}

buildScript块的repositories主要是为了Gradle脚本自身的执行,可以声明的资源包括依赖项、第三方插件、maven仓库地址等。我在写的一篇博客《尝试Artifactory》中Gradle脚本需要com.jfrog.artifactory插件才能执行成功,而这个插件是从URL为https://plugins.gradle.org/m2/的Maven仓库获得。

build.gradle

allprojects {
    repositories {
    …
    }

    dependencies {
    …
    }

}

allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。

dependencies{}

简介

dependencies是project一个方法,闭包作为参数。

依赖范围

其他网址:
gradle依赖:implementation 和compile的区别 - 简书Managing Dependencies of JVM Projects(官网文档)








































说明

compile/testCompile    //deprecated

implementation/testImplementation

compile在3.x及之后依然能用。

compileOnly/testCompileOnly

只在编译时有效,不会参与打包 

compileClasspath

testCompileClasspath

继承自:compile, compileOnly, implementation

继承自:testCompile, testCompileOnly, testImplementation

annotationProcessor

使能注解处理器。比如:lombok就要到。

runtime/testRuntime   //deprecated

runtimeOnly/testRuntimeOnly

编译时不会参与,很少用

runtimeClasspath

testRuntimeClasspath

继承自:runtimeOnly, runtime, implementation

继承自:testRuntimeOnly, testRuntime, testImplementation

archives

uploadArchives任务会用到

default

继承自:runtimeClasspath

implementation与compile区别

compile: 普通的依赖, 第三方库在 module 中依赖后其他 module 都可以使用该库
implementation:将该依赖隐藏在内部,而不对外部公开。它仅仅对当前的module提供接口。

例如我们当前项目结构如下

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaXlpbmcwY2FuZ2xhbmc_size_16_color_FFFFFF_t_70

LibraryA 中引用了 LibraryC 的库,如果对 LibraryC 的依赖用的是 implementation 关键字。 如下:

  1. dependencies {
  2. . . . .
  3. implementation projectpath':libraryC'
  4. }

那么LibraryC 中的接口,仅仅只能给 LibraryA 使用,而我们的 App Module 是无法访问到 LibraryC 提供的接口的,也就是将该依赖隐藏在内部,而不对外部公开。这就是implementation关键字的作用。

建议

在Google IO 相关话题的中提到了一个建议,就是依赖首先应该设置为implementation的,如果没有错,那就用implemention,如果有错,那么使用compile指令,这样会使编译速度有所增快。

那为什么要这么做呢?
答案是: 1. 加快编译速度。2. 隐藏对外不必要的接口。

为什么能加快编译速度呢?

这对于大型项目含有多个Module模块的, 以上图为例,比如我们改动 LibraryC 接口的相关代码,这时候编译只需要单独编译LibraryA模块就行, 如果使用的是api或者旧时代的compile,由于App Module 也可以访问到 LibraryC,所以 App Module部分也需要重新编译。当然这是在全编的情况下。

写法

单个依赖

  1. dependencies {
  2. //写法1
  3. compile group: 'ch.qos.logback', name: 'logback-classi', version: '1.2.3'
  4. //写法2
  5. compile "ch.qos.logback:logback-classic:1.2.3"
  6. }

多个依赖

  1. dependencies {
  2. //写法1
  3. compile "javax.servlet:javax.servlet-api:3.1-b07"
  4. compile "org.slf4j:slf4j-log4j12:1.7.5"
  5. //写法2
  6. compile (
  7. "javax.servlet:javax.servlet-api:3.1-b07",
  8. "org.slf4j:slf4j-log4j12:1.7.5"
  9. )
  10. }

工程依赖

同一个构建中可以建立工程依赖,一个工程的 jar 包可以提供给另外一个工程使用。例如我们可以让 api 工程以依赖于 my_base 工程的 jar 包。这样 Gradle 在构建 api 之前总是会先构建 my_base工程。

api工程的build.gradle文件:

  1. dependencies {
  2. compile project(':my_base')
  3. }

文件夹下的jar依赖

可以依赖指定文件夹下的jar文件,如,依赖lib目录下所有的jar文件

  1. dependencies {
  2. implementation fileTree(dir:'lib',includes:['*.jar'])
  3. }

buildscript{}

简介

gradle在执行脚本时,会优先执行buildscript代码块中的内容,然后才会执行剩余的build脚本。

如果你想在脚本中使用一些第三方的插件、类库等,就需要自己手动添加对这些插件、类库的 引用。而这些插件、类库又不是直接服务于项目的,而是支持其它build脚本的运行。所以你应当将这部分的引用放置在buildscript代码块中。

项目实例

  1. buildscript {
  2. ext {
  3. springBootVersion = '2.1.1.RELEASE'
  4. lombokVersion = '1.18.10'
  5. }
  6. repositories {
  7. ...
  8. }
  9. dependencies {
  10. classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
  11. }
  12. }
  13. apply plugin: 'java'
  14. apply plugin: 'org.springframework.boot'
  15. apply plugin: 'io.spring.dependency-management'
  16. group = 'abcd'
  17. version = '0.0.1-SNAPSHOT'
  18. sourceCompatibility = 1.8
  19. ext['springCloudVersion'] = 'Greenwich.RC2'
  20. dependencies {
  21. //Spring Boot
  22. compile('org.springframework.boot:spring-boot-starter')
  23. //Spring MVC
  24. compile('org.springframework.boot:spring-boot-starter-web')
  25. compile('org.springframework.boot:spring-boot-starter-aop')
  26. compile("org.projectlombok:lombok:${lombokVersion}")
  27. }
  28. dependencyManagement {
  29. imports {
  30. mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
  31. }
  32. }

ext{}

其他网址

ext官网文档

简介

ext是Gradle领域对象的一个属性,我们可以将自定义的属性添加到ext对象上,Build.gradle中的其它代码片段可以使用。Gradle的属性可以用此命令打印出来:gradle properties。

ext属性是ExtensionAware类型的一个特殊的属性,ExtentionAware接口的实现类为Project, Settings, Task, SourceSet等,ExtentionAware可以在运行时扩充属性,而这里的ext,就是里面的一个特殊的属性而已。

一般单项目中,ext所在类型为project,即,通过project.${key}可以访问到;root项目中,ext所在类型为rootProject,即,通过rootProject.${key}可以访问到。

gradle.properties跟build.gradle的ext{}有同样作用,见:gradle系列—其他文件_feiying0canglang的博客-CSDN博客

单项目示例

build.gradle

  1. buildscript {
  2. ext {
  3. springBootVersion = '2.1.1.RELEASE'
  4. lombokVersion = '1.18.10'
  5. }
  6. repositories {
  7. ...
  8. }
  9. dependencies {
  10. classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
  11. }
  12. }
  13. apply plugin: 'java'
  14. apply plugin: 'org.springframework.boot'
  15. apply plugin: 'io.spring.dependency-management'
  16. group = 'abcd'
  17. version = '0.0.1-SNAPSHOT'
  18. sourceCompatibility = 1.8
  19. ext['springCloudVersion'] = 'Greenwich.RC2'
  20. dependencies {
  21. //Spring Boot
  22. compile('org.springframework.boot:spring-boot-starter')
  23. //Spring MVC
  24. compile('org.springframework.boot:spring-boot-starter-web')
  25. compile('org.springframework.boot:spring-boot-starter-aop')
  26. compile("org.projectlombok:lombok:${lombokVersion}")
  27. }
  28. dependencyManagement {
  29. imports {
  30. mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
  31. }
  32. }

多项目示例

build.gradle(root项目)

  1. buildscript {
  2. ...
  3. }
  4. allprojects {
  5. ...
  6. }
  7. ...
  8. ext {
  9. lombokVersion = '1.18.10'
  10. }

build.gradle(module级项目)

  1. dependencies {
  2. compile("org.projectlombok:lombok:${rootProject.lombokVersion}")
  3. //这样也可以
  4. //compile("org.projectlombok:lombok:${rootProject.ext.lombokVersion}")
  5. }

sourceSets{}

其他网址

The Java Plugin

说明

Java插件默认的目录项目如下:

  1. src/main/java //Production Java source.
  2. src/main/resources //Production resources, such as XML and properties files.
  3. src/test/java //Test Java source.
  4. src/test/resources //Test resources.
  5. src/sourceSet/java //Java source for the source set named sourceSet.
  6. src/sourceSet/resources //Resources for the source set named sourceSet

这个目录是可以修改的,例如:

  1. sourceSets {
  2. main {
  3. java {
  4. srcDirs = ['src/main/java', '../my_base/src/main/java']
  5. }
  6. /*resources {
  7. srcDirs = ['../my_base/main/resources']
  8. } */
  9. }
  10. }

这样修改之后,把base(根项目)放到子项目同级路径之下,子项目就可以包含根项目了。

其他

allprojects{}

subprojects{}

configurations{}

artifacts{}

publishing{}

发表评论

表情:
评论列表 (有 0 条评论,68人围观)

还没有评论,来说两句吧...

相关阅读