gradle知识点散记

gradle中api、implementation和compile的区别

api或compile关键字引用的包对于其他module来说是可见的,而implementation关键字引用的包对于其他module来说是不可见的,也就是说只能用于本项目中。

配置子项目

  1. 需要setting.gradle文件,写法为:

    rootProject.name = 'root-project'
    include 'project1'
    include 'project2'
    
  2. 如果想引用跟’root-project’同级的项目作为其子模块,表达方式为:

    rootProject.name = 'root-project'
    include 'sub-project1'
    include 'sub-project2'
    include 'sub-project3'
    project(':sub-project3').projectDir = file("$rootDir/../sub-project3")
    

    $rootDir指的是root-project项目所在的目录,至于…我觉得是说从rootDir开始找,一层层找,一直到找到sub-project3为止

共享配置

有3种方式可以共享配置,各有各的使用场景:

  1. allprojects
    allprojects是根Project的一个属性,在Gradle中,我们可以通过根Project的allprojects()方法将配置一次性地应用于所有的Project,当然也包括定义Task。比如:

    allprojects {
       apply plugin: 'idea'
       
       task allTask << {
          println project.name
       }
    }
    

    以上Gradle脚本将闭包中的代码应用在所有的Project中,包括root-project本身
    第二种写法:

    configure(allprojects){ project ->
    	apply plugin: 'idea'
    	...
    	def projectName = project.name
    	//为后端模块增加spring boot起步依赖
        def projectName = project.name
    	if(projectName.substring(projectName.length()-3,projectName.length()) != 'web'){
    		 dependencies{
                implementation 'org.springframework.boot:spring-boot-starter-actuator'
                ...
             }
        xxxxx
        ...
    	}
    }
    
  2. subprojects
    subprojects和allprojects一样,也是父Project的一个属性,在父项目的build.gradle脚本里,但subprojects()方法用于配置所有的子Project(不包含根Project)。

    subprojects {
        apply plugin: 'java'
        repositories {
            mavenCentral()
        }
        ext {
              guavaVersion = ’14.0.1’
              junitVersion = ‘4.10’ 
        } 
    
        dependencies {
            compile(
                    “com.google.guava:guava:${guavaVersion}”
            )
            testCompile(
                    “junit:junit:${junitVersion}”
            )
        }
    
         task subTask << {
           println project.name
         }
    }
    

    此外,这里还在ext里配置依赖包的版本,方便以后升级依赖的版本。

  3. configure
    在项目中,并不是所有的子项目都会具有相同的配置,但是会有部分子项目具有相同的配置。Gradle提供的 configure 属性块可以让我们根据模块名称引入特定插件。:

    configure(allprojects.findAll { it.name.startsWith('sub') }) {
       subTask << {
          println 'this is a sub project'
       }
    }
    

    在上面的代码中,我们先找到所有Project中名字以“sub”开头的Project,然后再对这些Project进行配置,在配置中,我们向这些Project的subTask中加入了一条额外的打印语句。

    :sub-project1:subTask
    sub-project1
    this is a sub project
    :sub-project2:subTask
    sub-project2
    this is a sub project
    

    或者我们可以通过ext定义一个变量再传入到configure中:

    ext.subProjects = allprojects.findAll { it.name.startsWith('sub') }
    
    configure(subProjects) {
        apply plugin: 'war'
    }
    

独享配置

我们所有的Task定义工作都是在root-project中进行的,而sub-project1和sub-project2中的build.gradle文件依然什么都没有。事实上,我们可以将所有对子Project的配置均放在根Project中进行。在上面的例子中,我们通过allprojects()和subprojects()将所有的子Project都包含在了配置之内,其实我们还可以对单个Project进行单独配置。比如,在root-project的build.gradle中加入:

project(':sub-project1') {
   task forProject1 << {
      println 'for project 1'
   }
}

以上脚本向sub-project1中加入了名为forProject1的Task,在执行“gradle forProject1”时,终端输出如下:

:sub-project1:forProject1
for project 1

注意这里子项目名字前面有一个冒号(:)。 通过这种方式,指定对应的子项目,并对其进行配置。

(2)我们还可以在每个子项目的目录里建立自己的构建脚本。在上例中,可以在子项目core目录下为其建立一个build.gradle文件,并在该构建脚本中配置core子项目所需的所有配置。例如,在该build.gradle文件中添加如下配置:

ext{
    hibernateVersion = ‘4.2.1.Final’
}
dependencies { 
    compile “org.hibernate:hibernate-core:${hibernateVersion}”
}

依赖管理

通过io.spring.dependency-management插件实现类Maven的依赖管理方式:

plugins {
  id "io.spring.dependency-management" version "1.0.8.RELEASE"
}


gradle有两种方案可以解决同一项目,不同版本依赖的问题。

  • dsl(待补充)
  • 导入一个或者多个已经存在的Maven bom文件

dsl暂时还不清楚,后续补充~~~

导入Maven Bom的方式:

dependencyManagement {
     imports {
          mavenBom 'io.spring.platform:platform-bom:1.0.1.RELEASE'
     }
}

dependencies {
     compile 'org.springframework.integration:spring-integration-core'
}


这个配置会将Spring框架的Bom的依赖应用到当前的项目,bom会帮忙填充版本,
你也可以自己指定版本;它会根据两者取一个合理不冲突的值

此外如果是springboot项目,还有另一个插件:

dependencyManagement {
        imports {
            mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
        }
    }

buildscript中的repositories和allprojects的repositories的作用和区别

  1. buildScript块里面的代码是gradle执行脚本需要的依赖。一些插件需要这个额外的依赖才能起作用,比如这个插件:

    ////修复了Windows Gradle长类路径问题。修复了错误消息为“ CreateProcess error = 206,文件名或扩展名太长”的JavaExec / Test任务
    apply plugin: "ua.eshepelyuk.ManifestClasspath"
    
    

    要想让他生效,就必须在buildscript里引入依赖

    buildscript {
        repositories {
            maven{ url "http://maven.aliyun.com/repository/gradle-plugin"}
        }
        dependencies {
            classpath "gradle.plugin.ua.eshepelyuk:ManifestClasspath:1.0.0"
        }
    }
    
    

    另外引用一下:

    gradle脚本自身需要使用的资源。可以声明的资源包括依赖项、第三方插件、maven仓库地址等。而在build.gradle文件中直接声明的依赖项、仓库地址等信息是项目自身需要的资源。

    作者:zheting
    链接:https://www.jianshu.com/p/d3008623cced
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  2. allprojects里是项目本身需要的依赖,比如“mysql:mysql-connector-java”,“org.projectlombok:lombok”等等

sourceSets用法

对于他的解释,官网是这么说的:

大意是说SourceSet包括源文件及位置、它们的依赖、编译输出的位置这三个概念,SourceSet可以把不同文件目录里的文件按照逻辑关系组织起来。

  1. 它可以改变固定的Java的标准项目目录布局

    sourceSets {
        main {
            java {
                srcDirs = ['src/java']
            }
            resources {
                srcDirs = ['src/resources']
            }
        }
    }
    
    

    这样,gradle就只在src/java下搜源代码,而不是在src/main/java(固定的Java的标准项目目录布局)下。

  2. .如果我想在打包的时候, 不包含某些文件, 可以如下进行设置

        sourceSets {
            main {
                java {
                    exclude '/test/**'  // 不想包含文件的路径
                }
                resources {
                    exclude '/resource/**' // 不想包含的资源文件路径
                }
                .....
            }
        }
    
    

    或者我想将java目录中的xml文件等文件作为资源文件使用

    subprojects {
        sourceSets {
            main {
                resources {
                    srcDirs = ["src/main/java","src/main/resources"]
                    excludes = ["**/*.java"]
                }
            }
        }
    }
    
    
  3. 指定manufact文件

    sourceSets{
        mainClassName='xxxx.SpringbootApplication'
    }
    
    

参考文献

Gradle多模块项目

Gradle中的SourceSet理解

Android gradle SourceSets介绍与使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章