Gradle启动之gradle-wrapper
gradle-wrapper即gradle的包装器。
gradle它完成了gradle的环境配置以及gradle的启动。(也就是说到这一步gradle才开始启动起来)
EntryPoint
前面分析到了,gradlew shell脚本执行java 程序启动了gradle-wrapper.jar,接着就从这里开始进行分析。
代码量还是比较少的。
美中不足的是没有gradle-wrapper的源代码,代码没注释可读性稍差,不过好在逻辑简单。就不去翻gradle源码了。
Notes:
如果对代码有洁癖的bro,可以打开gradle源代码
- subprojects/wapper
- subprojects/cli
- subprojects/wrapper-shared
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 27 28 29
| public static void main(String[] args) throws Exception { File wrapperJar = wrapperJar(); File propertiesFile = wrapperProperties(wrapperJar);、 File rootDir = rootDir(wrapperJar); CommandLineParser parser = new CommandLineParser(); parser.allowUnknownOptions(); parser.option(new String[]{"g", "gradle-user-home"}).hasArgument(); parser.option(new String[]{"q", "quiet"}); SystemPropertiesCommandLineConverter converter = new SystemPropertiesCommandLineConverter(); converter.configure(parser); ParsedCommandLine options = parser.parse(args); Properties systemProperties = System.getProperties(); systemProperties.putAll(converter.convert(options, new HashMap())); File gradleUserHome = gradleUserHome(options); addSystemProperties(systemProperties, gradleUserHome, rootDir); Logger logger = logger(options); WrapperExecutor wrapperExecutor = WrapperExecutor.forWrapperPropertiesFile(propertiesFile); wrapperExecutor.execute(args, new Install(logger, new Download(logger, "gradlew", "0"), new PathAssembler(gradleUserHome, rootDir)), new BootstrapMainStarter()); }
|
参数配置
参数配置需要如下类
CommandLineParser
进行参数的解析获取ParsedCommandLine
SystemPropertiesCommandLineConverter
进行参数的转换,将解析后的参数转化为 Map<String, String> 。
Properties
参数最后的存放容器
数据转化图如下
执行启动
整个过程涉及
Install
下载并配置gradle
BootstrapMainStarter
引导启动gradle
在执行下载之前会进行下载的配置,配置是存在于gradle-warpper.properties文件下
1 2 3
| WrapperExecutor wrapperExecutor = WrapperExecutor.forWrapperPropertiesFile(propertiesFile);
wrapperExecutor.execute(...);
|
WrapperExecutor.execute
1 2 3 4
| File gradleHome = install.createDist(this.config);
bootstrapMainStarter.start(args, gradleHome);
|
Install
过程如下:
- 通过exclusiveFileAccessManager.access进行进程的互斥操作(其通过FileLock实现)
- 获取File操作权以后进行文件的下载操作。
- 下载完成后解压。
过程图如下:
BootstrapMainStarter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public void start(String[] args, File gradleHome) throws Exception { File gradleJar = findLauncherJar(gradleHome); if (gradleJar == null) { throw new RuntimeException(String.format("Could not locate the Gradle launcher JAR in Gradle distribution '%s'.", gradleHome)); } else { 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((Object)null, args); if (contextClassLoader instanceof Closeable) { contextClassLoader.close(); }
} }
|
小结
- 到目前为止gradle并没有启动
- gradle-wrapper目前所做的也不过是依据gradle-wrapper.properties的文件的配置,下载gradle并启动