前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA编译工具gradle

JAVA编译工具gradle

原创
作者头像
mariolu
修改2019-09-25 14:10:38
2.3K0
修改2019-09-25 14:10:38
举报

一、编译工具历史

grade用在android环境被大家所熟知,其实grade是一种流行的编译框架,也可以用在编译java环境上。

1.1 Java编译步骤

java工程的编译史是,JAVA工程一开始是用javac,但是构建一个项目需要做到:

  • 编译源码
  • 单元测试、集成测试
  • 执行静态代码分析
  • 创建发布版本
  • 部署到目标环境
  • 部署传递过程
  • 执行冒烟测试和自动功能测试

1.2 编译演进史

完成这一系列步骤的是项目构建工具,先后有了ANT, Maven,Gradle

  • ANT是类似于Make的自动化编译工具,编译规则用XML描述。但是ANT的XML描述文件不便于人工阅读,并且臃肿。而且ANT没有依赖包管理(Ivy改进了)。
  • 后面又有了Maven。Maven解决了依赖包管理问题,并且能够从网络上下载依赖包。但是Maven没有解决包版本冲突问题,虽然改进了XML的描述语法更加简洁,但是还是有XML缺点。
  • Gradle最大的改进是,抛弃XML,拥抱DSL描述性语言,语法更简洁,同样的意思用极少量的语言表达出来。

二、gradle认知

2.1 buildscript块

代码语言:javascript
复制
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
    }
}

buildscript中定义了脚本需要使用的资源。包括依赖项、第三方插件、maven仓库地址等。gradle在执行脚本时,第一执行buildscript代码块中的内容,然后执行剩余的build脚本。

2.2 插件

“buildscript {}”块指定第三方库作为Gradle插件的话,指定插件使用“apply plugin”。比如接着在build.gradle继续写入。

代码语言:javascript
复制
apply plugin: "java"
apply plugin: "eclipse"
apply plugin: "idea"
apply plugin: "application"

// use jacocoTestReport task to create coverage report
apply plugin: "jacoco"

2.3 jdk版本限定

接着使用sourceCompatibility 和targetCompatibility定义jdk版本。分别是制定编译java文件字节码和java虚拟机兼容的版本号。

代码语言:javascript
复制
sourceCompatibility = 1.8
targetCompatibility = 1.8

2.4 常量

接下来定义些常量。常量定义了常用组件的版本号,在后续脚本直接引用此常亮,后续有升级依赖版本号更方便。

代码语言:javascript
复制
def log4jVersion = "2.11.2"
def scalaVersion = "2.11"
def sparkVersion = "2.2.0"
def clouderaVersion = "cdh6.0.0"
//def kafkaVersion = "0.9.0-kafka-2.0.2"
def kafkaVersion = "0.8.2.1"
def jacksonVersion = "2.9.9"

2.5 依赖仓库

使用repository定义依赖仓库:

代码语言:javascript
复制
repositories {
    mavenCentral()

    // spark
    maven {
        url "https://repository.cloudera.com/artifactory/cloudera-repos/"
    }
}

2.6 mainClassname定义了class的名字

代码语言:javascript
复制
mainClassName="com.xxx.xxx"

2.7 配置强制版本号和exclude选项

代码语言:javascript
复制
configurations.all {
    resolutionStrategy {
        force "io.netty:netty-all:4.1.6.Final"
        force "io.netty:netty-tcnative-boringssl-static:1.1.33.Fork23"
    }
    exclude group: 'org.slf4j', module: 'slf4j-log4j12'
}

2.8 依赖模块

buildscript代码块中的repositories和dependencies的使用方式与直接在build.gradle文件中一样。不同之处是在buildscript代码块中你可以对dependencies使用classpath声明。compile是build使用的依赖,而testCompile是编译测试用例所需要的依赖。

代码语言:javascript
复制
dependencies {

    compile "com.googlecode.json-simple:json-simple:1.1"

    compile("io.lettuce:lettuce-core:5.0.3.RELEASE") {
        exclude group: 'org.apache.logging.log4j',  module: 'log4j-slf4j-impl'
        exclude group: "io.netty"
    }

    testCompile "info.solidsoft.mockito:mockito-java8:1.0.0-beta"

    compile fileTree(dir: 'libs', include: ['*.jar'])
}

2.9 测试相关:

代码语言:javascript
复制
test {
    systemProperty "io.lettuce.core.epoll", "false"

    testLogging {
        exceptionFormat "full"
        events "passed", "skipped", "failed"

        quiet {
            events "failed"
            exceptionFormat "full"
        }
    }

    reports {
        junitXml.enabled = true
        html.enabled = true
    }

    if (Files.exists(Paths.get("reports"))) {
        File out = File.createTempFile("testlog-", ".txt", new File("reports"))

        beforeTest { descriptor ->
            out.append("Running test: " + descriptor + "\n");
        }

        // listen to standard out and standard error of the test JVM(s)
        onOutput { descriptor, event ->
            out.append(event.message.replaceAll(/\n$/, "") + "\n")
        }
    }
}

2.10 解析完的构建

开始构建会进入到此项脚本

代码语言:javascript
复制
gradle.taskGraph.whenReady {
}

2.11 各种task

接着可以定义各种task。

代码语言:javascript
复制
task spark(type: Jar) {
    from sourceSets.main.output
    baseName = 'spark'
}

2.12 打包后的操作

代码语言:javascript
复制
compileJava.doLast {
    tasks.instrument.execute()
}

三、gradle使用

3.1 安装gradle

当前最新的是这个wget https://downloads.gradle-dn.com/distributions/gradle-5.6.2-bin.zip。这个链接不能保证后面也有效。

3.2 使用gradle

让gradle去解析build.gradle文件或者执行./gradlew tasks列出所有可执行的task。

图1 grdle列出所有的task
图1 grdle列出所有的task

执行相应的tasks任务,比如./gradlew build,./gradlew test等等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、编译工具历史
    • 1.1 Java编译步骤
      • 1.2 编译演进史
      • 二、gradle认知
        • 2.1 buildscript块
          • 2.2 插件
            • 2.3 jdk版本限定
              • 2.4 常量
                • 2.5 依赖仓库
                  • 2.6 mainClassname定义了class的名字
                    • 2.7 配置强制版本号和exclude选项
                      • 2.8 依赖模块
                        • 2.9 测试相关:
                          • 2.10 解析完的构建
                            • 2.11 各种task
                              • 2.12 打包后的操作
                              • 三、gradle使用
                                • 3.1 安装gradle
                                  • 3.2 使用gradle
                                  相关产品与服务
                                  腾讯云代码分析
                                  腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档