Javagradle简单理解

47次阅读

共计 5827 个字符,预计需要花费 15 分钟才能阅读完成。

简介(百度百科)

定义:Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建开源工具。它使用一种基于 Groovy 的特定领域语言 (DSL) 来声明项目设置,目前也增加了基于 Kotlin 语言的 kotlin-based DSL,抛弃了基于 XML 的各种繁琐配置。
简介:Gradle 是一个基于 JVM 的构建工具,是一款通用灵活的构建工具,支持 maven,Ivy 仓库,支持传递性依赖管理,而不需要远程仓库或者是 pom.xml 和 ivy.xml 配置文件,基于 Groovy,build 脚本使用 Groovy 编写

日常使用:

  • gradle 对多工程的构建支持很出色,工程依赖是 gradle 的第一公民。
  • gradle 支持局部构建。支持多方式依赖管理:包括从 maven 远程仓库、nexus 私服、ivy 仓库以及本地文件系统的 jars 或者 dirs
  • gradle 是第一个构建集成工具,与 ant、maven、ivy 有良好的相容相关性。
  • 轻松迁移:gradle 适用于任何结构的工程,你可以在同一个开发平台平行构建原工程和 gradle 工程。通常要求写相关测试,以保证开发的插件的相似性,这种迁移可以减少破坏性,尽可能的可靠。这也是重构的最佳实践。
  • gradle 的整体设计是以作为一种语言为导向的,而非成为一个严格死板的框架。
  • 免费开源

所以:
gradle 就是又能干 maven 的活,又能干 ant 的活,用 groove 语言写脚本,表达能力还更强。

语句详解

最外层的 build.gradle
1、buildscript 里是 gradle 脚本的执行所需依赖,分别是对应的 maven 库和插件

buildscript {
    repositories {
        maven {url = 'http://maven.repos.xxx.com/nexus/content/groups/public/'  // 加载私有 Maven 仓库}
    }
    dependencies {classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:1.2" // 加载插件,用到里面的函数方法}
}


apply plugin: "org.sonarqube" // 接入 sonarqube,代码质量管理。它整合了传统的静态代码检查,并对单元测试覆盖率和代码重复率进行数据统计。sonarqube { // 同级配置 gradle.properties
    properties {property "sonar.host.url", System.getenv('SONAR_HOST_URL')
        property "sonar.login", System.getenv('SONAR_LOGIN')
        property "sonar.password", System.getenv('SONAR_PASSWORD')
    }
}

2、allprojects 里是项目本身需要的依赖,比如我现在要依赖我自己 maven 库的 xx 库,那么我应该将 maven {url‘http://maven.repos.xxx.com/ne…‘}写在这里,而不是 buildscript 中,不然找不到。

// 这个 allprojects{}就是一个 Script Block  
allprojects {
    apply plugin: 'eclipse'
    apply plugin: 'idea'
    repositories { // 一个 Script Block 
        mavenLocal()  // 优先从本地仓库下载
        maven {url  'http://maven.repos.xxx.com/nexus/content/groups/public/'}
    }
    eclipse {
        classpath {downloadSources=true // 插件的配置}
    }
    group = 'com.xxx'    // 公司名
    version = '1.3.2'    // 版本号
}

3、排除传递依赖。排除传递依赖有多种原因,远程仓库中不存在,运行时不需要,或者版本冲突。排除传递依赖的方式有两种:

  • 直接在 configuration 中排除
  • 在具体的某个 dependency 中排除

    subprojects {

       configurations {compile.exclude group:"org.codehaus.jackson",module:"jackson-mapper-asl" // 排除依赖}
       //config java
       sourceCompatibility = compatibilityVersion
       targetCompatibility = compatibilityVersion
       [compileJava, javadoc, compileTestJava]*.options*.encoding = encoding
       sourceSets {
           main {
               resources {srcDirs('src/main/java')      // 将 java 目录加入到 resources 的目录里面,java 的子目录里面有一些 mapper 的 xml
               }
           }
       }
       checkstyle { // 格式检测
           configFile = file(rootDir.getAbsolutePath() + '/config/checkstyle/checkstyle.xml')
           System.setProperty("parent_dir", rootDir.getAbsolutePath())
       }
       findbugs { // 检测语法相关规则
           excludeFilter = file(rootDir.getAbsolutePath() + '/config/findbugs/findbugs-exclude.xml')
       }
    
       /**
        * gradle 工程汇总所有的 jar 包的坐标都在 dependencies 属性中设置
        * 每个 jar 包的坐标都有三个基本元素组成
        * group, name, version
        * testCompile 标识该 jar 包在测试的时候起作用,该属性为 jar 包的作用域
        * 我们在 gradle 里面添加坐标时都需要带上 jar 包的作用域
     */
    dependencies {compile("com.xxx:dubbo-service-common:2.0.2-SNAPSHOT"){
            exclude module:'kryo' // 排除依赖
            exclude module:'minlog'
            exclude module:'zkclient'
            exclude module:'netty'
            exclude module:'spring-beans'
            exclude module:'spring-core'
            exclude module:'spring-context'
            exclude module:'spring-aop'
            exclude module:'spring-expression'
            exclude module:'spring-web'
        }
        compile(
                'com.xxx:xxx-java-common:3.1.6-SNAPSHOT', // 依赖,group:module:version
                'com.xxx:seller-service-api:0.2.3',
                'com.xxx.bigdata.sea:opsea-interface:1.0-SNAPSHOT',
                'com.xxx:member-service-model:2.0.17',
                'com.xxx.common:jfalcon:1.1.0'
        )
        compile("com.xxx:payment-service-api:1.4") {transitive = false}
    }
    tasks.withType(FindBugs) { // 对 FindBugs 启用 HTML 报告
        reports {
            xml.enabled = false
            html.enabled = true
        }
    }
 
    // 生成 jar 包和 source 代码映射
    task sourcesJar(type: Jar, dependsOn: classes) { 
        classifier = 'sources'
        from sourceSets.main.allSource
    }
    task javadocJar(type: Jar, dependsOn: javadoc) {
        classifier = 'javadoc'
        from javadoc.destinationDir
    }
    artifacts {
        archives sourcesJar
        archives javadocJar
    }
 
}
defaultTasks 'clean', 'build'
task wrapper(type: Wrapper) {gradleVersion = '2.2.1'}

2、common-service-api/build.gradle

// jar 包的清单属性
jar {
    manifest {attributes 'Implementation-Title': 'common-service-api', 'Implementation-Version': version}
}
// 依赖的插件
dependencies {
    compile(
            "org.jboss.resteasy:jaxrs-api:3.0.7.Final",
            "org.hibernate:hibernate-validator:5.1.3.Final",
            "com.xxx:jackson-mapper-asl-internal:1.9.13"
    )
}
// 排除依赖
configurations {compile.exclude module:'mockito-all'}
// 文件名
archivesBaseName = 'common-service-api'
// 发布 jar 的命令, 执行 gradle uploadArchives
// 把 jar 包发布到本地或者是远程,或者多个目录下
uploadArchives {
    repositories {
        mavenDeployer {repository(url: 'http://maven.repos.xxx.com/nexus/content/repositories/releases/'){authentication(userName: "deployment", password: "deployment123456")
            }
            snapshotRepository(url: 'http://maven.repos.xxx.com/nexus/content/repositories/snapshots') {authentication(userName: 'deployment', password: 'deployment123456');  
            }
            pom.project{
                name project.name
                packaging 'jar'
                description 'common service api'
            }
        }
    }
}
// javadoc 部署
task javadocDeploy(type:Exec){
    workingDir 'build/docs/javadoc'
    commandLine 'cp','-r','./','/home/centos/javadoc/ROOT/javadoc/financeService/api'
     
    standardOutput = new ByteArrayOutputStream()
    ext.output = {return standardOutput.toString()
    }
}
task javadocDelete(type:Exec){commandLine 'rm','-rf','/home/centos/javadoc/ROOT/javadoc/financeService/api/*'}
javadocDeploy.dependsOn javadoc,javadocDelete
javadoc {
    options {
        encoding "UTF-8"
        charSet 'UTF-8'
    }
}

3、common-service-provider/build.gradle

  • compile 放在这个 configuration 下的依赖是在编译代码时所使用的,但它作为一个分组,包含代码和编译所需的依赖。
  • runtime 代码在运行时需要的依赖,默认,也会包含 compile 中的依赖。
  • testCompile 编译测试代码时所需要的依赖,默认,被编译的代码和代码需要的编译依赖也属于该分组。
  • testRuntime 运行测试时需要的依赖。默认,包含 compile,runtime 和 testCompile 的分组的构建和依赖。

    compile(“org.apache.flume.flume-ng-clients:flume-ng-log4jappender:1.6.0”){

       exclude module:'jackson-core-asl'
       exclude module:'jackson-mapper-asl' 
       exclude module:'netty'
       exclude module:'libthrift'}
       runtime("org.hibernate:hibernate-validator:5.1.3.Final",
               "javax.el:javax.el-api:2.2.4",
               "com.sun.el:el-ri:1.0",
               "mysql:mysql-connector-java:5.1.34",
               "org.apache.zookeeper:zookeeper:3.4.6",
               "com.101tec:zkclient:0.3",
               "org.slf4j:slf4j-log4j12:1.7.12")
       testCompile(
               'junit:junit:4.12',
               'org.springframework:spring-test:4.2.1.RELEASE',
               'com.h2database:h2:1.4.186',
               'org.mockito:mockito-all:1.10.19',
               'org.powermock:powermock-module-junit4-rule-agent:1.6.4',
               'org.powermock:powermock-module-junit4:1.6.4',
               'org.powermock:powermock-api-mockito:1.6.4',
               'uk.co.jemos.podam:podam:6.0.2.RELEASE'
       )

正文完
 0