Gradle 庖丁解牛(构建源头源码浅析),移动端开发技术创新

本文深入探讨Gradle的启动过程,从BootstrapMainStarter开始,逐步剖析Gradle如何通过ClassLoader加载GradleMain,进一步调用EntryPoint的run方法。文章通过源码分析,展示了Gradle构建过程中涉及的Action、CommandLineActionFactory和ExecutionListener等关键组件的工作原理,揭示了Gradle构建任务执行的深层逻辑,最后聚焦于GradleLauncher,揭示了Gradle构建的初始化、配置和执行三大生命周期。
摘要由CSDN通过智能技术生成

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});

if (contextClassLoader instanceof Closeable) {

((Closeable) contextClassLoader).close();

}

}

}

不解释,快上车,真的 Gradle 要现身了,Wrapper 的使命即将终结,我们把重点转到 org.gradle.launcher.GradleMain 的 main 方法,如下:

public class GradleMain {

public static void main(String[] args) throws Exception {

new ProcessBootstrap().run(“org.gradle.launcher.Main”, args);

}

}

GG了,莫慌,我们的重点不是看懂 Gradle 的每一句代码,我们需要捡自己需要的重点,这货设置各种 ClassLoader 后最终还是调用了 org.gradle.launcher.Main 的 run 方法,实质就是 EntryPoint 类的 run 方法,因为 Main 类是 EntryPoint 类的实现类,而 EntryPoint 的 run 方法最主要做的事情就是创建了一个回调监听接口,然后调用了 Main 重写的 doAction 方法,所以我们去到 Main 的 doAction 看看,如下:

public class Main extends EntryPoint {

protected void doAction(String[] args, ExecutionListener listener) {

createActionFactory().convert(Arrays.asList(args)).execute(listener);

}

CommandLineActionFactory createActionFactory() {

return new CommandLineActionFactory();

}

}

这货实质调用了 CommandLineActionFactory 实例的 convert 方法得到 Action 实例,然后调用了 Action 的 execute 方法,我去,真特么绕的深,这弯溜的,我们会发现 CommandLineActionFactory 里的 convert 方法实质除过 log 记录准备外干的惟一一件事就是创建其内部类 WithLogging 的对象,这时候我们可以发现 Action 的 execute 方法实质就是调用了 WithLogging 的 execute 实现,如下:

public void execute(ExecutionListener executionListener) {

//executionListener 是前面传入的回调实现实例

//各种解析config,譬如参数的–内容等等,不是我们的重点

//各种初始化、log启动等等,不是我们的重点

//大招!!!外面new WithLogging实例时传入的参数!!!

action.execute(executionListener);

}

这不,最终还是执行了 `new ExceptionReportingAction(

new JavaRuntimeValidationAction(

new ParseAndBuildAction(loggingServices, args)),

new BuildExceptionReporter(loggingServices.get(StyledTe

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值