美文网首页
gradle通关系列(二)-编写Gradle构建

gradle通关系列(二)-编写Gradle构建

作者: kevin丶xie | 来源:发表于2021-02-08 22:59 被阅读0次

    编写Gradle构建

    了解什么是Gradle,以及Gradle能够帮我们做什么之后,那该如何使用Gradle呢?

    构建Java Application

    如果我们现在需要构建一个java application,那我们该怎样做呢?当然是实现一个个构建java application的步骤了,首先编译一个个java源文件,然后创建清单文件配置主类,最后将所有的文件打成jar包。

    这么麻烦的过程Gradle已经帮我们写好了,我们只需要使用Gradle内置的application插件就可以完成java application的打包了,上代码

    plugins {
        //应用application插件
        application
    }
    
    //将javaSrc文件夹添加到java源文件路径,不配置的话默认为src/main/java
    java {
        sourceSets {
            named("main") {
                java {
                    srcDir("javaSrc")
                }
            }
        }
    }
    
    //配置加载的主类
    application {
        mainClassName = "com.kevinxie.gradledemo.Main"
    }
    

    然后我们执行run的task就可以完成java application的编译及打包了。

    构建C++ Application

    之前我们了解到Gradle几乎可以构建任何类型的软件,那我现在想构建一个c++的application程序可以吗?当然可以,Gradle为我们内置了cpp application插件

    //应用cpp-application插件
    apply(plugin = "cpp-application")
    
    
    configure<CppApplication>() {
        source {
            from("cppSrc/cpp")
        }
        privateHeaders {
            from("cppSrc/headers")
        }
    }
    

    Gradle内置插件

    我们可以在gradle-api-xxx.jar中的META-INF中的gradle-plugins文件中去查找,每一个.properties文件都对应着一个plugin的实现类,这些文件名都是其对应插件的id,这些插件id都是以org.gradle开头的,所以我们使用内置插件的时候,可以省略插件id前面的org.gradle.,我们看看org.gradle.java.properties文件中的内容

    implementation-class=org.gradle.api.plugins.JavaPlugin
    

    java插件对应的实现类就是org.gradle.api.plugins.JavaPlugin类,当我们应用java插件时,就会调用JavaPlugin类中的apply方法,为我们完成一些通用构建任务的创建,以及拓展配置项。

    Gradle内置插件的使用方式

    Gradle有那么多内置的插件,那怎么快速的上手使用每个插件呢?

    • 看文档,去官网找对应插件的文档
    • 直接看Extension对应的源码,看哪些字段是可配置的

    以application插件为例,我们可以查看Plugin源码,然后看插件拓展了哪些Extension,然后对应到Extension源码,就能够跟着源码来看有哪些配置,我们为什么可以直接配置application呢?

    public void apply(final Project project) {
        //应用JavaPlugin
        project.getPluginManager().apply(JavaPlugin.class);
        ...
            //添加Extensions
        ApplicationPluginConvention pluginConvention = addExtensions(project);
        ...
    }
    
    private ApplicationPluginConvention addExtensions(Project project) {
        ApplicationPluginConvention pluginConvention = new DefaultApplicationPluginConvention(project);
        pluginConvention.setApplicationName(project.getName());
        project.getConvention().getPlugins().put("application", pluginConvention);
        //创建了application的拓展,对应到的拓展对象是JavaApplication
        project.getExtensions().create(JavaApplication.class, "application", DefaultJavaApplication.class, pluginConvention);
        return pluginConvention;
    }
    

    然后我们就可以阅读JavaApplication的源码来看我们可以配置哪些内容,所有set属性的都是我们可以配置的

    public interface JavaApplication {
            //配置应用名称
        void setApplicationName(String applicationName);
            //配置主类名
        void setMainClassName(String mainClassName);
            //配置应用默认jvm参数
        void setApplicationDefaultJvmArgs(Iterable<String> applicationDefaultJvmArgs);
            //配置应用执行文件夹
        void setExecutableDir(String executableDir);
            //配置应用分布
        void setApplicationDistribution(CopySpec applicationDistribution);
    }
    

    当然,如果能够自定义插件,那这个就是基本操作了

    相关文章

      网友评论

          本文标题:gradle通关系列(二)-编写Gradle构建

          本文链接:https://www.haomeiwen.com/subject/ghxqxltx.html