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列表。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值