gradle wrapper源码可以参考我的github: https://github.com/xiaoyur347/gradlew
gradle比gradle wrapper复杂的多,所谓gradle wrapper包括以下的部分。
文件 | 含义 |
---|---|
gradlew | Unix脚本(支持Linux/MacOS) |
gradlew.bat | Win脚本 |
gradle/wrapper/gradle-wrapper.jar | gradle-wrapper核心jar |
gradle/wrapper/gradle-wrapper.properties | gradle-wrapper配置文件。 |
gradlew/gradlew.bat
基本就是做了一些路径查找和转换工作,最后转入
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
- 1
如果将路径展开,差不多就是
exec java "${JVM_OPTS[@]}" -classpath $APP_HOME/gradle/wrapper/gradle-wrapper.jar org.gradle.wrapper.GradleWrapperMain "$@"
- 1
所以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 "$@"
- 1
如果将路径展开,差不多就是
exec java "${JVM_OPTS[@]}" -classpath $APP_HOME/lib/gradle-launcher-2.14.1.jar org.gradle.launcher.GradleMain "$@"
- 1
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
- 1
编译,得到的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));
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
.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
- 1
- 2
- 3
其中base36的规则为:
- 从gradle/wrapper/gradle-wrapper.properties中得到distributionUrl,即https://services.gradle.org/distributions/gradle-2.14.1-all.zip,注意文件中的\不算。
- 对distributionUrl计算md5。例如printf “https://services.gradle.org/distributions/gradle-2.14.1-all.zip” | md5
得到8c9a3200746e2de49722587c1108fe87。 - 利用0x8c9a3200746e2de49722587c1108fe87构造一个uint 128位整数。
- 将整数利用base36得到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);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
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发行版。
--------------------- 本文来自 xiaoyur347 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xiaoyur347/article/details/54313246?utm_source=copy