小透明的java学习记录(3)——Gradle编译

Gradle编译

为什么使用Gradle编译

我在书本上看到了基于Java的编译,脚本、编译器、注解等我觉得对于初学者来说有些复杂,我没有看下去,想到在平时的工作中使用的Gradle编译,自我感觉可以仔细了解下。Gradle是基于Groovy语言的编译脚本,Groovy不仅仅局限于编译java代码,还可以编译其他语言的代码,对于一个开发团队来说,这点非常重要。
Groovy 给 Java 开发人员提供了迄今为止最大的透明度. 其基本的符号和类型与 Java 是一样的,其封装结构和许多其他的地方也是如此。Groovy 在这基础上提供了更多的功能, 而且与 Java 有共同的基础。
以下根据W3Cschool的内容学习。(https://www.w3cschool.cn/gradle_user_guide/gradle_user_guide-s3k126h1.html)

安装Gradle

  1. 安装java jdk
  2. 下载一个任意版本的Gradle的zip包(http://services.gradle.org/distributions/)
  3. 解压缩
  4. 将Gradle的bin目录配置到系统路径中
  5. 在控制台运行 Gradle -v命令检查Gradle是否安装成功
    小透明的java学习记录(3)——Gradle编译_第1张图片

构建脚本基础

Gradle 里的任何东西都是基于这两个基础概念:
projects ( 项目 )
tasks ( 任务 )

例1:
build.gradle

task hello{
    doLast{
        println 'Hello World!'
    }
}

task hello << {
    println 'Hello World!'
}

执行命令,这里的 -q 表示quiet 模式. 它不会生成 Gradle 的日志信息 (log messages)

>gradle -q hello
Hello World!

例2:
build.gradle

task upper{
    String someString = 'Apple Dog'
    println 'name = ' + someString
    println 'UpperName = ' + someString.toUpperCase()
}

运行结果

>gradle -q upper
name = Apple Dog
UpperName = APPLE DOG

例3:
build.gradle

task count{
    4.times {print "$it "}
}

运行结果

>gradle -q count
0 1 2 3 

例4:任务之间的依赖关系
build.gradle

task hello{
    println 'Hello World!'
}

task intro(dependsOn: hello){
    println 'I am Gradle'
}

运行结果

>gradle -q intro
Hello World!
I am Gradle

例5:动态创建任务
build.gradle

4.times { counter ->
    task "task$counter" << {
        println "I am task number $counter"
    }
}

运行结果

>gradle -q task1
I am task number 1

例6:任务创建以后,还可以加入额外的依赖
build.gradle

4.times { counter ->
    task "task$counter" << {
        println "I am task number $counter"
    }
}
task1.dependsOn task2, task0

运行结果

>gradle -q task1
I am task number 0
I am task number 2
I am task number 1

例7:给一个已经存在的task加入行为

task hello{
    println 'Hello Earth!'
}
hello.doLast {
    println 'Hello Mars!'
}
hello << {
    println 'Hello Jupiter!'
}
hello.doFirst {
    println 'Hello Venus!'
}

运行结果

>gradle -q hello
Hello Earth!
Hello Venus!
Hello Mars!
Hello Jupiter!

例8:段标记 $ 可以访问任意一个已经存在的任务
build.gradle

task hello{
    println 'Hello Earth!'
}

task test{
    println "$hello.name"
}

运行结果

>gradle -q test
Hello Earth!
hello

例9:给任务加入自定义属性
build.gradle

task myTask {
    ext.myProperty = "myValue"
}
task printmyProperty << {
    println myTask.myProperty
}

运行结果

>gradle -q printmyProperty
myValue

例10:定义默认任务
build.gradle

defaultTasks 'cleans', 'run'
task cleans << {
    println 'cleans'
}
task run << {
    println 'run'
}
task other << {
    println 'other'
}

运行结果

>gradle -q
cleans
run

例11:根据执行的任务不同产生不同的输出
build.gradle

task distribution << {
    println "we build the zip version=$version"
}
task release(dependsOn: distribution) << {
    println 'release now'
}
gradle.taskGraph.whenReady {taskGraph ->
    if(taskGraph.hasTask(release)){
        version = '1.0'
    }else {
        version = '1.0-SNAPSHOT'
    }
}

运行结果

>gradle -q release
we build the zip version=1.0
release now
>gradle -q distribution
we build the zip version=1.0-SNAPSHOT

Java构建入门

插件
插件是Gradle的扩展,Gradle自带了很多的插件,插件会通过一些方式控制工程的配置,还会加入一些预配置的任务。
在Gradle中增加java插件
build.gradle

apply plugin: 'java'

输入命令

>gradle tasks

可以看到build的所有任务

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.

其中一些有用的任务是

assemble 编译并打包代码,但是不运行单元测试,有些插件会影响该任务的运行
build 编译代码
clean 删除build目录和所有为build目录生成的文件
check 编译并测试代码,有些插件会影响该任务的运行

外部依赖
编写java代码的时候经常会需要用到外部的依赖包,此时如果想要编译代码,就需要将这些依赖包写入build.gradle
加入Maven仓库

repositories {
    mavenCentral()
}

加入一些依赖文件

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    compile group: 'junit', name: 'junit', version: '4.+' 

定制项目
输入命令 gradle properties 可以列出项目的所有默认属性。此时我们可以通过修改build.gradle来定制项目,使得项目输出的属性不一样。
定制MANIFEST.MF文件

sourceCompatibility = 1.5
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
    }
}

测试阶段加入一个系统属性

test {
    systemProperties 'property': 'value'
}

学到这里,我觉得有些头疼,其实我并不理解上面说到的maven库,测试阶段,或者是什么系统属性,再继续自学这个教程我觉得我会爆炸!!!
其实我学gradle的初衷也不过就是为了3个问题:如何打包jar包,如何引入依赖jar包,以及如何在安卓工程中使用gradle命令打包出一个可执行的手机apk。下面我就根据这3个问题进行调试。

如何打包jar包

首先,我们建一个非常简单的工程mycalculate,该工程只有一个src文件夹和一个build.gradle文件。
在这里插入图片描述
src目录下有2个文件
小透明的java学习记录(3)——Gradle编译_第2张图片
build.gradle

apply plugin: 'java'

jar {
    manifest {
        attributes("Main-Class": "com.study.wangxianlu.mycalculate", "Implementation-Title": "Gradle")
    }
    into('libs') {
        from('src/com/study/wangxianlu/mycalculate/')
    }
}

mycalculate.java,定义了2个函数

package com.study.wangxianlu.mycalculate;

public class mycalculate {

    public double add(double a, double b) {
        return a + b;
    }

    public double reduce(double a, double b) {
        return a - b;
    }
}

myoutput.java,定义了1个函数

package com.study.wangxianlu.mycalculate;

public class myoutput {

    public void op() {
        System.out.println("**********  *********8");
    }
	
}

在build.gradle所在目录下执行命令gradle build
在这里插入图片描述
生成jar文件
小透明的java学习记录(3)——Gradle编译_第3张图片

如何引入依赖jar包

首先我们建一个安卓工程Gradlestudy
将刚刚生成的包放在lib文件夹下
小透明的java学习记录(3)——Gradle编译_第4张图片
右键->Add As Library
可以看到app下面的build.gradle中的依赖增加了一行
小透明的java学习记录(3)——Gradle编译_第5张图片
而jar包也变得可以打开,可以使用了
小透明的java学习记录(3)——Gradle编译_第6张图片

打包可执行apk

执行gradle assembleRelease
小透明的java学习记录(3)——Gradle编译_第7张图片
然后发现这个apk并不可用!!!需要对apk进行签名,然后我发现这篇文章写得很好https://www.jianshu.com/p/4b886a63b590
但是目前我并没有自己的签名,我只是学习而已,所以我想用android studio自带的签名。在build.gradle中增加这么几行

android {
    signingConfigs {
        releaseConfig {
            keyAlias 'stone'
            keyPassword 'android'
            storeFile file('C:/Users/Administrator/.android/debug.keystore')
            storePassword 'android'
        }
    }
    buildTypes {
        release {
            //...
            signingConfig signingConfigs.releaseConfig
        }
    }
}

执行gradle assembleRelease
emmmmm…此时没有任何apk文件生成,懵逼树上懵逼果,懵逼树下你和我???
执行gradle clean
再执行gradle build
出现apk
小透明的java学习记录(3)——Gradle编译_第8张图片
安装到手机
成功!!!
我有点懵~~~就这样吧
本篇over >_<

你可能感兴趣的:(java学习记录)