gradle通关系列(二)-编写Gradle构建
编写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);
}
当然,如果能够自定义插件,那这个就是基本操作了