美文网首页
Gradle使用三十六计

Gradle使用三十六计

作者: JohnYuCN | 来源:发表于2021-08-14 13:56 被阅读0次

    gradle生态系统的使用,算是一个长期艰巨的工作,艰巨性更多的来自于习惯的阻力;这是一篇需要不断积累的文章...


    乍暖还寒的鸭绿江畔--2021年2月4日傍晚

    快速初始化及更换gradle的版本

    mkdir pname && cd pname && gradle init 
    

    此时项目下的gradle/wrapper/gradle-wrapper.properties文件中的内容,可以用来修改gradle对于本项目的构建版本,注意:更换后,请使用./gradlew [taskname]进行构建操作。

    全局替换远程库设置:

    在${USER_HOME}/.gradle/init.gradle 文件中,进行如下配置:

    def repoConfig = {
        all { ArtifactRepository repo ->
            if (repo instanceof MavenArtifactRepository) {
                def url = repo.url.toString()
                if (url.contains('repo1.maven.org/maven2') || url.contains('jcenter.bintray.com')) {
                    println "gradle init: (${repo.name}: ${repo.url}) removed"
                    remove repo
                }
            }
        }
        // maven { url 'http://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }
        mavenLocal()
        maven { url 'https://maven.aliyun.com/repository/central' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
    }
    
    allprojects {
        buildscript {
            repositories repoConfig
        }
    
        repositories repoConfig
    }
    

    强制刷新本地缓存:

    gradle会把从远程下载的库在本地${GRADLE_HOME}/caches/下进行缓存,如果远程库内容发生变动,就会导致本地无法感知的问题,此时可以进行如下操作加以解决:

    ./gradlew build --refresh-dependencies
    

    但要注意,如果使用了mavenLocal(),而你使用的库又位于其中,就需要额外手动去强制刷新maven的本地库,而这恰是maven最大的痛点,因为只能通过手删除本地jar或使用snapshot版本,来完成此类工作。

    更加详细的查看构建的全过程:

    gradle虽然提供了控制台的日志,但这根本是无法观察构建的全貌的,我们可以将构建的全部信息PUSH到其官网的服务上,进而可以通过web浏览的方式进行查看,方法如下:

    ./gradlew build --scan
    

    屏幕会出现:Do you accept these terms? [yes, no]的提示,回答yes后,会出现:https://gradle.com/s/7nzupn2lvrkte的响应,浏览后会查看到详细的信息(需要事先使用邮箱进行激活操作)。

    java编译版本的控制

    原理是 java plugin 的compileJava task类中有两个属性控制着编译的版本:

    //java 插件的任务
    compileJava {
        targetCompatibility=JavaVersion.VERSION_11
        sourceCompatibility=JavaVersion.VERSION_11
    }
    

    但是,这两个属性在Project类中也可以设置,只是运行时被complieJava类进行覆盖(如此处不设置,即为继承),同时Project类中如果不设置,则默认采用了当前JVM的版本。
    此方法的缺点是:当前运行gradle的JVM如果低于targetCompatibility的版本,则构建无法进行,所以可以使用以下方法进行改良:

    在java plugin 的 java task中:

    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(11)
        }
    }
    

    原理是,下载一个微型的OPEN JDK做为环境进行构建和编译,同时将以上两个属性设置为相同的版本,即11。但此时,就不能再设置这个属性了。

    生成可执行的jar包

    在 java plugin 的 jar 任务中,做如下配置:

    jar {
        manifest { //配置jar文件的manifest
            attributes(
                    "Manifest-Version": 1.0,
                    'Main-Class': 'cn.johnyu.MyApp' //指定main方法所在的文件
            )
        }
    }
    

    相关文章

      网友评论

          本文标题:Gradle使用三十六计

          本文链接:https://www.haomeiwen.com/subject/ztxebltx.html