Gradle源码入门八

启动的时候,调用了



launcher.cli.BuildActionsFactory.java

    private Runnable runBuildInProcess(StartParameter startParameter, DaemonParameters daemonParameters, ServiceRegistry loggingServices) {
        ServiceRegistry globalServices = ServiceRegistryBuilder.builder()
                .displayName("Global services")
                .parent(loggingServices)
                .parent(NativeServices.getInstance())
                .provider(new GlobalScopeServices(false))
                .build();
        InProcessBuildActionExecuter executer = new InProcessBuildActionExecuter(globalServices.get(GradleLauncherFactory.class));
        return daemonBuildAction(startParameter, daemonParameters, executer);
    }
	build()会调用
	 /**
     * Adds a service provider bean to this registry. This provider may define factory and decorator methods.
     */
    public DefaultServiceRegistry addProvider(Object provider) {
        findProviderMethods(provider);
        return this;
    }
最后会走到
	org\gradle\internal\service\scopes\GlobalScopeServices.java

	void configure(ServiceRegistration registration, ClassLoaderRegistry classLoaderRegistry) {
        final List<PluginServiceRegistry> pluginServiceFactories = new ServiceLocator(classLoaderRegistry.getRuntimeClassLoader(), classLoaderRegistry.getPluginsClassLoader()).getAll(PluginServiceRegistry.class);
        for (PluginServiceRegistry pluginServiceRegistry : pluginServiceFactories) {
            registration.add(PluginServiceRegistry.class, pluginServiceRegistry);
            pluginServiceRegistry.registerGlobalServices(registration);
        }
    }

getAll 会根据PluginServiceRegistry.class一系列规则,找到所有factory方法,规则如下:

规则就是ServiceLocator.java 的findFactoriesForServiceType(serviceType);

resourceName = ‘META-INF/services/org.gradle.internal.service.scopes.PluginServiceRegistry‘

找到

jar:file:/C:/gradle-2.2.1/lib/gradle-launcher-2.2.1.jar!/META-INF/services/org.gradle.internal.service.scopes.PluginServiceRegistry

->[org.gradle.tooling.internal.provider.ToolingServices]

implementations.add(implClass.asSubclass(serviceType));//父类是参数,转为子类

implClass = class org.gradle.tooling.internal.provider.ToolingServices

serviceType = interface org.gradle.internal.service.scopes.PluginServiceRegistry

------------------

可能有多个classLoader去load,所以可能会找到同样的jar包,代码保证重复的就不做了

jar:file:/C:/gradle-2.2.1/lib/gradle-launcher-2.2.1.jar!/META-INF/services/org.gradle.internal.service.scopes.PluginServiceRegistry

continue

-----------------

找到

jar:file:/C:/gradle-2.2.1/lib/plugins/gradle-dependency-management-2.2.1.jar!/META-INF/services/org.gradle.internal.service.scopes.PluginServiceRegistry

->

[class org.gradle.tooling.internal.provider.ToolingServices]

把所有实现的类名加入factory列表。

时间: 2024-08-07 21:20:46

Gradle源码入门八的相关文章

Gradle源码入门学习之十-- Listener &amp; Dispatch

new ListenerBroadcast<OutputEventListener>(OutputEventListener.class); -> public ListenerBroadcast(Class<T> type) { this.type = type; broadcast = new BroadcastDispatch<T>(type); source = new ProxyDispatchAdapter<T>(broadcast, ty

Gradle源码入门四

接三 如果我们运行gradle hello  (hello 是一个task) 代码会走到org.gradle.launcher.cli.RunBuildAction,  这个类的run()函数 public void run() { executer.execute( new ExecuteBuildAction(startParameter), new DefaultBuildCancellationToken(), new DefaultBuildActionParameters(clien

Gradle源码入门九-settings的include是如何工作的

先上call stack script.run()  in org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory 本代码中,script=settings_ani2pwefx3gv..... ->org.gradle.groovy.scripts.BasicScript.methodMissing(String name, Object params)  //name = 'include' params='sub_proje

Gradle源码入门三

本文以在command窗口执行最简单的 gradle -v 为例子说明 从上文提到的EntryPoint.java开始,调用该类的doAction</p><p>实际调用到Main.java  的doAction <pre name="code" class="java"> protected void doAction(String[] args, ExecutionListener listener) { createActio

gradle源码入门学习六

DefaultServiceRegistry之findProviderMethods private void findProviderMethods(Object target) { Set<String> methods = new HashSet<String>(); for (Class<?> type = target.getClass(); type != Object.class; type = type.getSuperclass()) { findDe

Gradle源码入门五

分析DefaultGradleLauncher.java private void doBuildStages(Stage upTo) 函数的第二步 // Evaluate settings script SettingsInternal settings = settingsHandler.findAndLoadSettings(gradle); buildListener.settingsEvaluated(settings); 从 startParameter 开始 StartParame

如何用Android Studio查看build.gradle源码

上一篇博客里讲过 build.gradle 里的每一行代码基本都是在调用一个方法,既然是这样,我们就可以用 android studio(下面简称as) 去查看它源码的方法注释说明,这样就可以理解每个方法是做什么的了,就算是在大神的 build.gradle 遇见一些没看懂的代码,也可以点进去看方法介绍来理解.就像我们在查看 SDK 里的各种方法一样. 但是有个问题,应该也有小伙伴跟我一样吧,每次在大神的 build.gradle 看到一堆不懂的代码时,按住 Ctrl 键后,鼠标移到代码上时有个

Spark Job的提交与task本地化分析(源码阅读八)

我们又都知道,Spark中任务的处理也要考虑数据的本地性(locality),Spark目前支持PROCESS_LOCAL(本地进程).NODE_LOCAL(本地节点).NODE_PREF.RACK_LOCAL(本地机架).ANY(任何)几种.其他都很好理解,NODE_LOCAL会在spark日志中执行拉取数据所执行的task时,打印出来,因为Spark是移动计算,而不是移动数据的嘛. 那么什么是NODE_PREF? 当Driver应用程序刚刚启动,Driver分配获得的Executor很可能还

[spring源码学习]八、IOC源码-messageSource

一.代码实例 我们在第八章可以看到,spring的context在初始化的时候,会默认调用系统中的各种约定好的bean,其中第一个bean就是id为messageSource的bean,我们了解这应该是一个读取properties的,并支持国际化的bean 1.首先我们定义这个bean,spring中默认提供了一些类,查了下主要是ResourceBundleMessageSource和ReloadableResourceBundleMessageSource,我们这里采用ResourceBund