gradle中api、implementation和compile的区别
api或compile关键字引用的包对于其他module来说是可见的,而implementation关键字引用的包对于其他module来说是不可见的,也就是说只能用于本项目中。
配置子项目
-
需要setting.gradle文件,写法为:
rootProject.name = 'root-project' include 'project1' include 'project2'
-
如果想引用跟’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种方式可以共享配置,各有各的使用场景:
-
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 ... } }
-
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里配置依赖包的版本,方便以后升级依赖的版本。
-
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的作用和区别
-
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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 -
allprojects里是项目本身需要的依赖,比如“mysql:mysql-connector-java”,“org.projectlombok:lombok”等等
sourceSets用法
对于他的解释,官网是这么说的:
大意是说SourceSet包括源文件及位置、它们的依赖、编译输出的位置这三个概念,SourceSet可以把不同文件目录里的文件按照逻辑关系组织起来。
-
它可以改变固定的Java的标准项目目录布局
sourceSets { main { java { srcDirs = ['src/java'] } resources { srcDirs = ['src/resources'] } } }
这样,gradle就只在src/java下搜源代码,而不是在src/main/java(固定的Java的标准项目目录布局)下。
-
.如果我想在打包的时候, 不包含某些文件, 可以如下进行设置
sourceSets { main { java { exclude '/test/**' // 不想包含文件的路径 } resources { exclude '/resource/**' // 不想包含的资源文件路径 } ..... } }
或者我想将java目录中的xml文件等文件作为资源文件使用
subprojects { sourceSets { main { resources { srcDirs = ["src/main/java","src/main/resources"] excludes = ["**/*.java"] } } } }
-
指定manufact文件
sourceSets{ mainClassName='xxxx.SpringbootApplication' }