如何告诉gradle utf8构建时用utf-8

Gradle构建脚本文件用来处理两件事情:一个是项目和另一个的任务。每个Gradle生成表示一个或多个项目。一个项目表示一个JAR库或Web应用程序,也可能表示由其他项目产生的JAR文件组装的ZIP。 简单地说,一个项目是由不同的任务组成。一个任务是指构建执行的一块工作。任务可能是编译一些类,创建一个JAR,产生的Javadoc或发布一些归档文件库。
注:Gradle使用Groovy语言编写脚本。
编写构建脚本Gradle提供了一个域特定语言(DSL),用于描述构建。 它使用 Groovy 语言,使其更容易来形容和构建。Gradle 中的每一个构建脚本使用UTF-8进行编码保存,并命名为 build.gradle 。
创建build.gradle文件看看下面的例子演示一个小脚本,它将打印 “Yiibai gradle qick start“。复制并保存以下脚本到文件:gradle-3.1studyscriptbuild.gradle。脚本中定义一个任务名称 helloword,这是用来打印”Yiibai gradle qick start“ 字符串。
在命令提示符下,进入存储 build.gradle 文件的目录并执行以下命令,得到结果如下所示 -
gradle-3.1studyscript&gradle -q helloword
Yiibai gradle qick start
可以通过指定一个快捷键(&&符号表示)到 doLast 语句来简化 helloword 任务。 如果将快捷方式添加到上述 helloword 任务,它看起来如下面脚本。
task helloword && {
println 'Yiibai gradle qick start'
使用 gradle -q helloword 命令执行上面的脚本,也会得到同样的输出结果。
Gradle如何使用GroovyGradle 构建脚本使用 Groovy API。 作为一个入门,我们来来看看下面的例子。以下示例演示将字符串转换为大写。复制并保存下面的代码到 build.gradle 文件。
task upper && {
String expString = 'YiiBai gradle tutorials'
println &Original: & + expString
println &Upper case: & + expString.toUpperCase()}
使用 gradle –q upper 执行上面的代码,如果命令执行成功,会得到下面的输出。
gradle-3.1studyscript&gradle -q upper
Original: YiiBai gradle tutorials
Upper case: YIIBAI GRADLE TUTORIALS
下面的例子 4 次打印隐式参数 ($it) 的值。复制并保存下面的代码到 build.gradle 文件。
task count && {
print &$it &
使用 gradle –q count 执行上面的代码,如果命令执行成功,会得到下面的输出。
gradle-3.1studyscript&gradle -q count
Groovy的JDK方法Groovy增加了很多有用的方法到标准的Java类。 例如,从Java API可迭代实现它遍历Iterable接口的元素的each() 方法。
复制并保存下面的代码到 build.gradle 文件。
task groovyJDKMethod && {
String myName = &Yiibai&;
myName.each() {
println &${it}&
使用 gradle –q groovyJDKMethod 执行上面的代码,如果命令执行成功,会得到下面的输出。
gradle-3.1studyscript&gradle -q groovyJDKMethod
加QQ群啦!
JAVA技术群(2000人群):
MySQL/SQL群(2000人群):
Python技术群(2000人群):
大数据开发群(2000人群): (Java,Python,R,Scala,Hadoop,Spark,zookeeper,kafka等技术)
Web开发群(新群):
(PHP,HTML/HTML5,JS/JQuery,CSS等技术)
Linux技术群(新群): (Redhat/Centos,Ubuntu,Shell,运维,监控等技术)
易百教程移动端:请扫描本页面底部(右侧)二维码关注微信公众号,或直接手机访问:
上一篇:下一篇:Gradle基本知识点与常用配置 - CSDN博客
Gradle基本知识点与常用配置
查看原文:
本文篇幅较长,文中系统地讲解了Gradle的基本知识点以及一些常用的命令和配置,适合于刚接触Gradle的同学;
在此基础上,可以阅读以下的实战经验文章:
(一)基本概念
Domain Specific Language,领域相关语言
Gradle是一个框架,它负责定义流程和规则;
每一个待编译的工程都叫一个Project;
每一个Project在构建的时候都包含一系列的Task。
3. Closure(闭包)
Closure是一段单独的代码块,它可以接收参数,返回值,也可以被赋值给变量:
def Closure1 = {
println 'Hello world'
Closure1() // 执行闭包,输出Hello world
//接收一个参数
def Closure2 = {
String str -& println str //箭头前面是参数定义,后面是执行代码,str为外部传入的参数
} //如果只有一个参数可以用it代替,也可写作:
def Closure2 = {
println it
Closure2('Hello world')// 执行闭包,输出Hello world
//接收多个参数
def Closure3 = {
String str , int n -& println "$str : $n" //参数前加$
} //也可以写作:
def Closure3 = {
str , n -& println "$str : $n"
Closure3('Hello world’, 1) // 执行闭包,输出Hello world : 1
//使用变量
def var = "Hello world"
def Closure4 = {
println var
Closure4() // 执行闭包,输出Hello world
//改变上下文
def Closure5 = {
println Var //这时还不存在
MyClass m = new MyClass()
Closure5.setDelegate(m) // 改变上下文,这时Var已经有了,在执行之前改变了
Closure5() //执行闭包,输出Hello world
class MyClass {
def Var = 'Hello world'
4. Property
Gradle在默认情况下已经为Project定义了很多Property,如下:
project:Project本身
name:Project的名字
path:Project的绝对路径
description:Project的描述信息
buildDir:Project构建结果存放目录
version:Project的版本号
通过ext来自定义Property:
ext.property1 = "this is property1"
property2 = "this is property2"
task showProperties && {
println property1
//直接访问
println property2
任何实现了ExtensionAware接口的Gradle对象都可以通过这种方式来添加额外的Property,比如Task也实现了该接口。
通过“-p”命令行参数定义Property:
task showCommandLineProperties && {
println propertyTest
gradle -P propertyTest ="this is propertyTest" showCommandLineProperties
通过JVM系统参数定义Property(需要以“org.gradle.project”为前缀):
gradle -D org.gradle.project.propertyTest="this is another propertyTest" showCommandLineProperties
另一种方式:
写入参数:gradle -DpropertyTest="this is another propertyTest"
读取参数:def propertyTest = System.properties['propertyTest']
通过环境变量设置Property(需要以“ORG_ GRADLE_ PROJECT_ ”为前缀):
export ORG_GRADLE_PROJECT_propertyTest = "this is yet another propertyTest"
gradle showCommandLineProperties
& Groovy会为每一个字段自动生成getter和setter,我们可以通过像访问字段本身一样调用getter和setter,如:
class GroovyBeanExample {
private String name
def bean = new GroovyBeanExample()
bean.name = 'this is name' //Groovy动态地为name创建了getter和setter
println bean.name
6. delegate机制
delegate机制可以使我们将一个闭包中的执行代码的作用对象设置成任意其他对象
class Child {
private String name
class Parent {
Child child = new Child();
void configChild(Closure c) {
c.delegate = child
c.setResolveStrategy Closure.DELEGATE_FIRST //默认情况下是OWNER_FIRST,即它会先查找闭包的owner(这里即parent)
def parent = new Parent()
parent.configChild {
name = "child name"
println parent.child.name
task有两个生命周期,配置阶段和执行阶段。
gradle在执行task时,都会先对task进行配置,task中最顶层的代码就是配置代码,在配置阶段执行,其他代码实在执行阶段执行的;
task关键字实际上是一个方法调用,我们不用将参数放在括号里面。
task Task1 {
println "hello” // 这段代码是在配置阶段执行的
task Task2 {
def name = "hello” // 这段代码是在配置阶段执行的
println name
} // 这段代码是在执行阶段执行的,相当于:
// doLast({
println 'Hello world!'
task Task3 && {
println name
// “&&”语法糖,表示追加执行过程,相当于doLast,因此整个代码都是在执行阶段执行的;与之相反的是doFirst。
//如果代码没有加“&&”,则这个任务在脚本initialization的时候执行(也就是你无论执行什么任务,这个任务都会被执行,“hello”都会被输出);
//如果加了“&&”,则在输入命令gradle Task3后才执行
通过TaskContainer的create()方法创建Task
tasks.create(name: 'hello') && {
println 'hello'
8. 自定义task
class HelloWorldTask extends DefaultTask {
String message = 'I am davenkin'
@TaskAction
def hello(){
println "hello world $message"
task hello(type:HelloWorldTask)
task hello1(type:HelloWorldTask){
message ="I am a programmer"
@TaskAction表示该Task要执行的动作,@Optional表示在配置该Task时,message是可选的
9. 任务配置
方法一:在定义Task的时候对Property进行配置
task hello1 && {
description = "this is hello1"
println description
方法二:通过闭包的方式来配置一个已有的Task
task hello2 && {
println description
description = "this is hello2"
} //Gradle会为每一个task创建一个同名的方法,该方法接受一个闭包
hello2.description = "this is hello2"//Gradle会为每一个task创建一个同名的Property,所以可以将该Task当作Property来访问
注:对hello2的description的设置发生在定义该Task之后,在执行gradle hello2时,命令行依然可以打印出正确的“this is hello2”,这是因为Gradle在执行Task时分为两个阶段:配置阶段、执行阶段。
所以在执行hello2之前,Gradle会扫描整个build.gradle文档,将hello2的description设置为“this is hello2”,再执行hello2。
方法三:通过Task的configure()方法完成Property的设置
task hello3 && {
println description
hello3.configure {
description = "this is hello3"
10. 任务依赖
task A && {
println 'Hello from A'
task B && {
println 'Hello from B'
B.dependsOn A
task A && {
println 'Hello from A'
dependsOn A
println 'Hello from B'
task B(dependsOn: A) {
println 'Hello from B'
11. 顺序执行
指之间无依赖关系的任务
task unit && {
println 'Hello from unit tests'
task ui && {
println 'Hello from UI tests'
task tests && {
println 'Hello from all tests!'
task mergeReports && {
println 'Merging test reports'
tests.dependsOn unit
//单元测试
tests.dependsOn ui
ui.mustRunAfter unit
//ui测试必须在单元测试之后执行
tests.finalizedBy mergeReports //表示tests执行完后,再执行mergeReports,等价于mergeReports.dependsOn tests
12. 增量式构建
为一个Task定义输入(inputs)和输出(outputs),在执行该Task时,如果它的输入和输出与前一次执行时没有变化,那么Gradle便会认为该Task是最新的(日志会输出“UP-TO-DATE“),因此不会重复执行
task combineFileContent {
def sources = fileTree('sourceDir')
def destination = file('destination.txt')
inputs.dir sources
// 将sources声明为该Task的inputs
outputs.file destination
// 将destination声明为outputs
destination.withPrintWriter { writer -&
sources.each {source -&
writer.println source.text
当首次执行combineFileContent时,Gradle会完整地执行该Task,但是紧接着再执行一次,命令行显示:
:combineFileContent UP-TO-DATE //被标记为UP-TO-DATE,表示该Task是最新的,不执行
BUILD SUCCESSFUL
Total time: 2.104 secs
如果修改inputs(上述即sourceDir文件夹)中的任何一个文件或删除destination.txt,再次调用“gradle combineFileContent”时,该Task又会重新执行
13. 自定义Plugin
在当前工程中的buildSrc/src/main/groovy/davenkin目录下创建DateAndTimePlugin.groovy文件和DateAndTimePluginExtension.groovy文件
// DateAndTimePlugin.groovy
package com.gradle.test
import org.gradle.api.Plugin
import org.gradle.api.Project
class DateAndTimePlugin implements Plugin&Project& {
void apply(Project project) {
//每个Gradle的Project都维护了一个ExtenionContainer,我们可以通过project.extentions访问额外的Property和定义额外的Property
project.extensions.create("dateAndTime", DateAndTimePluginExtension)
project.task('showTime') && {
println "Current time is " + new Date().format(project.dateAndTime.timeFormat)
project.tasks.create('showDate') && {
println "Current date is " + new Date().format(project.dateAndTime.dateFormat)
// DateAndTimePlugin.groovy
package com.gradle.test
class DateAndTimePluginExtension {
String timeFormat = "MM/dd/yyyyHH:mm:ss.SSS"
String dateFormat = "yyyy-MM-dd"
build.gradle文件中,再apply该Plugin
apply plugin: com.gradle.test.DateAndTimePlugin
// 可以通过以下方式对这两个Property进行重新配置
dateAndTime {
timeFormat = 'HH:mm:ss.SSS'
dateFormat = 'MM/dd/yyyy'
(二)常用命令和配置
1. 编译、打包
注:执行“./gradlew xxx”等同于执行“gradle xxx”,但执行“gradle xxx”需配置环境变量
清除build文件夹
./gradlew clean
检查依赖并编译打包
./gradlew build
编译并打Debug包
./gradlew assembleDebug
编译并打Release包
./gradlew assembleRelease
获取gradle版本号
./gradlew -v
查看所有任务
./gradlew tasks 或 gradle tasks
查看所有工程
gradle projects
查看所有属性
gradle properties
2. 常用任务
task A && {
println 'Hello from A'
终端输入:gradle A
task copyFile(type: Copy) {
from 'source'
into 'destination'
将source文件夹中的所有内容拷贝到destination文件夹中,
这两个文件夹都是相对于当前Project而言的,即build.gradle文件所在的目录
删除文件或文件夹
task deleteTest(type: Delete) {
delete 'file' ,'dir'
文件和文件夹是相对于当前Project而言的,即build.gradle文件所在的目录
执行shell命令
task runShell1(type: Exec) {
executable "sh"
args "-c", "rm ./app/libs/test.jar" //路径是相对于当前build.gradle文件
def cmd = 'date +%Y-%m-%d'
task shellTest && {
String date = cmd.execute().text.trim().toString() //带返回值
date //打印系统日期
执行java代码
task runJava(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
//执行文件所在路径
main = 'com.example.MyClass' // 执行方法所在类
// arguments to pass to the application
args 'haha','xixi' //多个参数用逗号隔开
task deleteDes(type: Delete) {
delete 'build/intermediates/bundles/release/class.jar', 'libs/mylib.jar'
task makeJar(type: Copy) {
from('build/intermediates/bundles/release/') {
include '*.jar' // 只拷贝jar格式的文件
into('libs')
//include('classes.jar') // 只拷贝classes.jar这个文件
rename('classes.jar', 'mylib.jar') // 重命名为mylib.jar
task releaseLib(type: Copy, dependsOn: [deleteDes, build, makeJar]) {
// 依赖多个任务
into "../app/libs"
from 'libs'
// 手动打包,gradle releaseLib
// 以下是在编译流程中插入生成jar包的task
android.libraryVariants.all { variant -&
variant.outputs.each { output -&
def file = output.outputFile
def fileName = 'classes.jar'
def name = variant.buildType.name
task "makeJar${variant.name.capitalize()}" && {
from("${projectDir}/build/intermediates/bundles/"+"${name}") {
include(fileName)
into(file.parent) // 可自定义存放路径
rename (fileName, "${project.name}"+"-${name}.jar")
project.tasks.whenTaskAdded { task -&
android.libraryVariants.all { variant -&
if (task.name == "bundle${variant.name.capitalize()}") {
task.finalizedBy "makeJar${variant.name.capitalize()}"
//以读取properties文件中保存的签名信息为例
def File propFile = new File('signing.properties')
if (propFile.canRead()) {
def Properties props = new Properties()
props.load(new FileInputStream(propFile))
if (props != null && props.containsKey('RELEASE_STORE_FILE') && props.containsKey('RELEASE_STORE_PASSWORD') &&
props.containsKey('RELEASE_KEY_ALIAS') && props.containsKey('RELEASE_KEY_PASSWORD')) {
android.signingConfigs.release.storeFile = file(props['RELEASE_STORE_FILE'])
android.signingConfigs.release.storePassword = props['RELEASE_STORE_PASSWORD']
android.signingConfigs.release.keyAlias = props['RELEASE_KEY_ALIAS']
android.signingConfigs.release.keyPassword = props['RELEASE_KEY_PASSWORD']
println 'all good to go'
android.buildTypes.release.signingConfig = null
println 'signing.properties found but some entries are missing'
println 'signing.properties not found'
android.buildTypes.release.signingConfig = null
3. 常用配置
设置全局参数(同额外属性设置)
compileSdkVersion = 22
buildToolsVersion = "22.0.1"
在module中引用全局参数:
compileSdkVersion pileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
将属性或方法放入ext{}就可以被全局引用
设置全局编码
allprojects {
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
设置全局编译器的版本
allprojects {
tasks.withType(JavaCompile) {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
去掉重复依赖
compile 'com.alibaba.fastjson.latest.integration' { //latest.integration 获取服务器上最新版本
exclude module: 'annotations', group: 'com.google.android'
本地aar包依赖
allprojects {
repositories {
dirs 'libs'
dependencies {
compile(name:'本地库aar的名字,不带后缀', ext:'aar')
4. java Plugin
Gradle的每个source set都包含有一个名字,并且包含有一个名为java的Property和一个名为resources的Property,他们分别用于表示该source set所包含的Java源文件集合和资源文件集合。在实际应用时,我们可以将他们设置成任何目录值,以下将资源文件按功能分包,使得与java文件分包保持一致
sourceSets {
manifest.srcFile 'src/main/AndroidManifest.xml'
java.srcDirs = ['src/main/java','.apt_generated']
aidl.srcDirs = ['src/main/aidl','.apt_generated']
assets.srcDirs = ['src/main/assets']
res.srcDirs =
'src/main/res/bindmobile', //绑定手机资源
'src/main/res/bycaptcha',
//验证码登录资源
'src/main/res/bypwd',
//密码登录资源
'src/main/res/pwdmodify',
//密码修改资源
'src/main/res/pwdreset',
//密码重置资源
'src/main/res/resource',
//其他资源
'src/main/res/'
(三)配置gradle,加快编译速度
~/.gradle/gradle.properties中添加如下配置(没有该文件则新建一个):
org.gradle.daemon=true //独立进程,停止后台进程命令:gradle --stop
org.gradle.parallel=true //并行构建,需要将项目拆分成多个子项目,通过aar引用才能起效
org.gradle.configureondemand=true //按需配置,目前还在试验孵化阶段,默认是关闭的
设置离线编译:
打开settings-&Build,Execution,Deployment-&Build Tools-&Gradle,
选中Offlie Work //更新依赖包时要取消它
命令行构建时在命令后面加上如下参数
--parallel
查看原文:
本文已收录于以下专栏:
相关文章推荐
本文将延续之前几篇博客的风格,先从基本概念入手,有了一定点理解之后再上主角;
在后续的代码中如果忘了某个概念的具体意义,可以回顾头来重新查看概念的介绍。
一、基本概念介绍1. package,A...
要使用Android Studio,就需要这个构建工具。
本文是一个粗略的 前6章的笔记,以未例驱动。
下载好最新版的Gradle(当前为2.2)后,解压。将Gradle的bin目录配置到环境变量...
Android Studio之Gradle多渠道打包由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有...
Gradle强大的编译能力和构建能力足以胜任日常中的开发,很多人将其视为maven的替代方案,至于用maven还是用Gradle这个根据各人喜爱或团队要求来决定。
Gradle快速查看指南
官网提供:...
Gradle常用命令1、Gragle常用命令之前接触了一些命令如./gradlew -v ./gradlew clean ./gradlew build,  注意都是./gradlew, ./代表当前...
关于Gradle Build Running很慢的问题,网上有很多关于这个问题的解答,如
C:\Users\你的用户名\.gradle目录下新建一个文件名为gradle.properties的文件。
可能其他人有更好的办法, 所以,这里只是解决方法之一.
------------------------------------------------------------------------...
转自:原文地址:http://blog.isming.me//android-build-speed-up/,转载请注明出处。
 谢谢大神
一.开启gradle单独的守护...
gradlehttps://gradle.org
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来...
这一篇博客,主要是面向对Gradle有所耳闻,但却没有一个比较清晰的概念的。在这篇博客里,将对Gradle进行一个简单的介绍,以及它的安装。
Gradle介绍
Gradle是一个基于JVM的构建工...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)使用构建工具gradle打包时,遇到的中文问题和解决方案 - CSDN博客
使用构建工具gradle打包时,遇到的中文问题和解决方案
1、使用gradle& clean& war 命令将项目打成war包,这一过程gradle没有提示报错。
2、将得到的myapp.war拷贝到tomcat下webapps(部署war包)
3、启动tomcat的时候,发现加载myapp.war失败,错误信息如下:
java.lang.IllegalArgumentException: MALFORMED
at java.util.zip.ZipCoder.toString(Unknown Source)
at java.util.zip.ZipInputStream.readLOC(Unknown Source)
at java.util.zip.ZipInputStream.getNextEntry(Unknown Source)
at com.yc.utils.TestZip.extZipFileList(TestZip.java:40)
at com.yc.utils.TestZip.main(TestZip.java:21)
这是因为tomcat启动的时候,会将.war文件解压,以文件夹的形式存放在webapps/下。显然出现上面的问题,是因为tomcat解压war失败。将得到的war包用WinRAR软件解压,发现也失败了。这样可以知道:是gradle打出的war包有问题,是损坏的。为啥gradle打的war包有问题了?
我用WinRAR打开(注意不是解压),发现了一个惊讶的结果:有2个含有中文名的文件,没有包含在war中。我将这2个文件手动到myapp.war的对应位置后保存,最后再用winRAR解压,发现能够成功解压。于是得出一个结论:gradle打包的时候会忽略含有中文的目录和文件。
解决方案是:&修改GRADLE_HOME/bin/gradle(windows系统中是gradle.bat)中的变量DEFAULT_JVM_OPTS
DEFAULT_JVM_OPTS=&-Dfile.encoding=UTF-8&
修改配置之后重新打包,发现得到的war包中已经包含了名称含有中文的目录和文件。用WinRar解压也是正常的,部署到tomcat也成功了。文件路径中含有中文是一件很麻烦的事儿,也不是最佳编程实践。
本文已收录于以下专栏:
相关文章推荐
/p/08a441fa3204目录
- 参考简介关于急速打包
之前有过一篇文章《Gradle编译打包小结...
最近一直在学习使用Gradle项目构建工具,但是一直遇到一个问题就是中文乱码,比如将易天乱码成了鏄撳ぉ,经过研究我发现这正是将UTF-8编码识别为GBK编码出现的现象。经过一番查阅,解决办法就是在bu...
先贴上一段位置文件
buildTypes {
// 不显示Log
buildConfigField &boo...
本文介绍使用gradle编译打包java项目,java项目仅仅为了演示,为了使用gradle脚本创建一个可执行的jar文件,即可以使用java命令直接执行,如:java –jar jarfile.ja...
gradle官网下载最新的压缩包,解压后设置环境变量 GRADLE_HOME 为解压目录,在path前加入 %GRADLE_HOME%\
打开cmd 运行 gradle -v
查看版本 当...
war可以开发的应用打包成部署包.最常的打包方法:
a.将开发的源目录src/main/java的文件打包成一个jar包,然后放入WEB-INF/lib目录下面.
b.不要将配置文件打包到jar里...
Gradle根据部署环境引用不同的配置文件进行打包
由于开发,测试,生产环境不同,需要不同的配置文件,如果项目多了打包很不方便。综合网上的一些资料,实现Gradle从Git上获取配置文件进行打包
只是出于好奇才打成war包,正常情况下不推荐war。打成jar包可以方便的使用外部配置,并且启动速度更快,也方便部署到docker等容器中。
一、应用插件1.1 gradle在gradle.build...
本文前半段摘抄自:/java-gradle-archive-different-profile/
后面是自己所写
配置 Gradle 配置文件
Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具。
上面这句话我觉得写得很官方,大家只需知道Gradle可以用来...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 gradle构建 的文章

 

随机推荐