gradle wrapper分析

gradle wrapper源码可以参考我的github: https://github.com/xiaoyur347/gradlew
gradle比gradle wrapper复杂的多,所谓gradle wrapper包括以下的部分。

文件含义
gradlewUnix脚本(支持Linux/MacOS)
gradlew.batWin脚本
gradle/wrapper/gradle-wrapper.jargradle-wrapper核心jar
gradle/wrapper/gradle-wrapper.propertiesgradle-wrapper配置文件。

gradlew/gradlew.bat

基本就是做了一些路径查找和转换工作,最后转入

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

如果将路径展开,差不多就是

exec java "${JVM_OPTS[@]}" -classpath $APP_HOME/gradle/wrapper/gradle-wrapper.jar org.gradle.wrapper.GradleWrapperMain "$@"

所以gradle wrapper的跨平台是通过在核心的jar上外包一层脚本,最终其实也就是调用java 应用路径/gradle/wrapper/gradle-wrapper.jar,并指定了main为org.gradle.wrapper.GradleWrapperMain,因为java支持多个main。

gradle/gradle.bat

额,研究gradle-wrapper跳转后,发现gradle也是一个脚本,跟gradlew也是基本类似的。

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.launcher.GradleMain "$@"

如果将路径展开,差不多就是

exec java "${JVM_OPTS[@]}" -classpath $APP_HOME/lib/gradle-launcher-2.14.1.jar org.gradle.launcher.GradleMain "$@"

gradle-wrapper.jar

就是gradle源码中的org.gradle.cli部分和org.gradle.wrapper部分。
我把gradle 2.14.1 src下相关的目录建了一个github,即https://github.com/xiaoyur347/gradlew。可实现用gradle来编译gradle-wrapper.jar

checkout代码后,通过

gradle assemble

编译,得到的jar包为./build/libs/gradlew.jar。可替换现有的jar包进行调试。

gradle-wrapper里主要就是下载gradle,和运行gradle命令。

gradle下载到${GRADLE_USER_HOME}/.gradle/wrapper目录。通常是user/.gradle/wrapper。注意,由于gradlew不使用系统的gradle,即使系统已经安装了gradle,仍然要进行下载。

gradle-wrapper调用gradle

调用在BootstrapMainStarter中。就是直接搜索gradleHome/lib/gradle-launcher-.*.jar,然后加载org.gradle.launcher.GradleMain的main()方法,这跟gradle加载$APP_HOME/lib/gradle-launcher-2.14.1.jar org.gradle.launcher.GradleMain是一致的。

package org.gradle.wrapper;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class BootstrapMainStarter {
    public void start(String[] args, File gradleHome) throws Exception {
        File gradleJar = findLauncherJar(gradleHome);
        URLClassLoader contextClassLoader = new URLClassLoader(new URL[]{gradleJar.toURI().toURL()}, ClassLoader.getSystemClassLoader().getParent());
        Thread.currentThread().setContextClassLoader(contextClassLoader);
        Class<?> mainClass = contextClassLoader.loadClass("org.gradle.launcher.GradleMain");
        Method mainMethod = mainClass.getMethod("main", String[].class);
        mainMethod.invoke(null, new Object[]{args});
    }

    private File findLauncherJar(File gradleHome) {
        for (File file : new File(gradleHome, "lib").listFiles()) {
            if (file.getName().matches("gradle-launcher-.*\\.jar")) {
                return file;
            }
        }
        throw new RuntimeException(String.format("Could not locate the Gradle launcher JAR in Gradle distribution '%s'.", gradleHome));
    }
}

.gradle/wrapper目录结构

用于存放gradle-wrapper下载gradle的zip包和解压后的文件夹。
wrapper的目录规则是

wrapper/dists/gradle-2.14.1-all/${base36}/gradle-2.14.1-all.zip
wrapper/dists/gradle-2.14.1-all/${base36}/gradle-2.14.1-all.zip.lck
wrapper/dists/gradle-2.14.1-all/${base36}/gradle-2.14.1-all.zip.ok

其中base36的规则为:

java代码如下:

import java.math.BigInteger;
import java.security.MessageDigest;

public class Hash {

    public static void main(String[] args) {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            byte[] bytes = args[0].getBytes();
            messageDigest.update(bytes);
            String str = new BigInteger(1, messageDigest.digest()).toString(36);
            System.out.println(str);
        } catch (Exception e) {
            throw new RuntimeException("Could not hash input string.", e);
        }
    }
}

c++ java代码见http://github.com/xiaoyur347/gradlew/helper
如果有兴趣mirror的话,建议保持“https://services.gradle.org/distributions/gradle-2.14.1-all.zip”的base36。
好吧,为了方便大家,给一些常用的base36。可以通过http://services.gradle.org/distributions/查看最新的gradle发行版。

链接base36
https://services.gradle.org/distributions/gradle-3.3-all.zip55gk2rcmfc6p2dg9u9ohc3hw9
https://services.gradle.org/distributions/gradle-3.2.1-all.zip8lz77g2tsnl6gxlpeowwkfgj1
https://services.gradle.org/distributions/gradle-3.2-all.zip97ld1dyml0oep92x4lyn4g235
https://services.gradle.org/distributions/gradle-3.1-all.zipejgglywf033yp6s4x8ahmgm74
https://services.gradle.org/distributions/gradle-3.0-all.zip6v8c6qg2jpi8twyfv2a5s9mii
https://services.gradle.org/distributions/gradle-2.14.1-all.zip8bnwg5hd3w55iofp58khbp6yv
https://services.gradle.org/distributions/gradle-2.14-all.zipt7wfomcrmv8dmyii9c9waem8
https://services.gradle.org/distributions/gradle-2.13-all.zip1b9wlm73elu4cqnbc0rk7r7qn
https://services.gradle.org/distributions/gradle-2.12-all.zip8ywkdai6puj5z81fume4e7njw
https://services.gradle.org/distributions/gradle-2.11-all.zipace7yl0a7udokebb27mt9s3qr
https://services.gradle.org/distributions/gradle-2.10-all.zipa4w5fzrkeut1ox71xslb49gst
https://services.gradle.org/distributions/gradle-2.9-all.zip1aw2ic01pldw5fkvoq6t1fsz4
https://services.gradle.org/distributions/gradle-2.8-all.zipah86jmo43de9lfa8xg9ux3c4h
https://services.gradle.org/distributions/gradle-2.7-all.zip4ryh47z6pv2tj9n03uiw8pzc6
https://services.gradle.org/distributions/gradle-2.6-all.zip2j4sg4877lcsg31diboouhun8
https://services.gradle.org/distributions/gradle-2.5-all.zipd3xh0kipe7wr2bvnx5sk0hao8
https://services.gradle.org/distributions/gradle-2.4-all.zip6r4uqcc6ovnq6ac6s0txzcpc0
https://services.gradle.org/distributions/gradle-2.3-all.zipw01pvxy5gty3tegjrai84pm3
https://services.gradle.org/distributions/gradle-2.2.1-all.zipc64ydeuardnfqctvr1gm30w53
https://services.gradle.org/distributions/gradle-2.2-all.zip1vevkra640w3rb9hkuw50q5we
https://services.gradle.org/distributions/gradle-2.1-all.zip488seql5pimt7vjvdsuqhh1ut
https://services.gradle.org/distributions/gradle-2.0-all.zipevtta6k9rngqxp6sxbf6unsdw
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值