这是一个关于Gradle的学习系列,其中包含以下文章:
请通过以下方式下载本系列文章的Github示例代码:
git clone https://github.com/davenkin/gradle-learning.git
和Maven一样,Gradle只是提供了构建项目的一个框架,真正起作用的是Plugin。Gradle在默认情况下为我们提供了许多常用的Plugin,其中包括有构建Java项目的Plugin,还有War,Ear等。与Maven不同的是,Gradle不提供内建的项目生命周期管理,只是java Plugin向Project中添加了许多Task,这些Task依次执行,为我们营造了一种如同Maven般的项目构建周期。更多有关Maven的知识,读者可以访问Maven官网,或者可以参考笔者写的Maven学习系列文章。
现在我们都在谈 领域驱动设计 ,Gradle本身的领域对象主要有Project和Task。Project为Task提供了执行上下文,所有的Plugin要么向Project中添加用于配置的Property,要么向Project中添加不同的Task。一个Task表示一个逻辑上较为独立的执行过程,比如编译Java源代码,拷贝文件,打包Jar文件,甚至可以是执行一个系统命令或者调用Ant。另外,一个Task可以读取和设置Project的Property以完成特定的操作。
让我们来看一个最简单的Task,创建一个build.gradle文件,内容如下:
task helloWorld << { println "Hello World!" }
这里的“<<”表示向 helloWorld 中加入执行代码——其实就是Groovy代码。Gradle向我们提供了一整套DSL(Domain Specific Language, 领域特定语言),所以在很多时候我们写的代码似乎已经脱离了Groovy,但是在底层依然执行的是Groovy。比如上面的task关键字,其实就是一个Groovy中的方法,而大括号之间的内容则表示传递给task()方法的一个闭包。除了“<<”之外,我们还很多种方式可以定义一个Task,我们将在本系列后续的文章中讲到。
在与build.gradle相同的目录下执行:
gradle helloWorld
:helloWorld Hello World! BUILD SUCCESSFUL Total time: 1.891 secs
在默认情况下,Gradle将当前目录下的build.gradle文件作为项目的构建文件。在上面的例子中,我们创建了一个名为helloWorld的Task,在执行gradle命令时,我们指定执行这个helloWorld Task。这里的helloWorld是一个DefaultTask类型的对象,这也是定义一个Task时的默认类型,当然我们也可以显式地声明Task的类型,甚至可以自定义一个Task类型(我们将在本系列的后续文章中讲到)。
比如,我们可以定义一个用于文件拷贝的Task:
task copyFile(type: Copy) { from 'xml' into 'destination' }
以上copyFile将xml文件夹中的所有内容拷贝到destination文件夹中。这里的两个文件夹都是相对于当前Project而言的,即build.gradle文件所在的目录。
Task之间可以存在依赖关系,比如taskA依赖于taskB,那么在执行taskA时,Gradle会先执行taskB,然后再执行taskB。声明Task依赖关系的一种方式是在定义一个Task的时候:
task taskA(dependsOn: taskB) { //do something }
Gradle在默认情况下为我们提供了几个常用的Task,比如查看Project的Properties、显示当前Project中定义的所有Tasks等。可以通过一下命令查看Project中所有的Task:
gradle tasks
:tasks ------------------------------------------------------------ All tasks runnable from root project ------------------------------------------------------------ Build Setup tasks ----------------- init - Initializes a new Gradle build. [incubating] wrapper - Generates Gradle wrapper files. [incubating] Help tasks ---------- components - Displays the components produced by root project 'gradle'. [incubating] dependencies - Displays all dependencies declared in root project 'gradle'. dependencyInsight - Displays the insight into a specific dependency in root project 'gradle'. help - Displays a help message. projects - Displays the sub-projects of root project 'gradle'. properties - Displays the properties of root project 'gradle'. tasks - Displays the tasks runnable from root project 'gradle'. Other tasks ----------- copyFile helloWorld To see all tasks and more detail, run with --all. BUILD SUCCESSFUL Total time: 2.122 secs
可以看到,除了我们自己定义的copyFile和helloWorld之外,Gradle还默认为我们提供了dependencies、projects和properties等Task。dependencies用于显示Project的依赖信息,projects用于显示所有Project,包括根Project和子Project,而properties则用于显示一个Project所包含的所有Property。
在默认情况下,Gradle已经为Project添加了很多Property,我们可以调用以下命令进行查看:
gradle properties
:properties ------------------------------------------------------------ Root project ------------------------------------------------------------ allprojects: [root project 'gradle'] ant: org.gradle.api.internal.project.DefaultAntBuilder@37b72ea antBuilderFactory: org.gradle.api.internal.project.DefaultAntBuilderFactory@cc239ba artifacts: org.gradle.api.internal.artifacts.dsl.DefaultArtifactHandler_Decorated@7d37f1c asDynamicObject: org.gradle.api.internal.ExtensibleDynamicObject@69d6a7cd baseClassLoaderScope: org.gradle.api.internal.initialization.DefaultClassLoaderScope@3162743f buildDir: H:\Works\TEMP\gradle\build buildFile: H:\Works\TEMP\gradle\build.gradle buildScriptSource: org.gradle.groovy.scripts.UriScriptSource@2c708440 buildscript: org.gradle.api.internal.initialization.DefaultScriptHandler@3047254d childProjects: {} class: class org.gradle.api.internal.project.DefaultProject_Decorated classLoaderScope: org.gradle.api.internal.initialization.DefaultClassLoaderScope@6cf31447 components: [] configurationActions: org.gradle.configuration.project.DefaultProjectConfigurationActionContainer@4e92466a configurations: [] convention: org.gradle.api.internal.plugins.DefaultConvention@66e8997c copyFile: task ':copyFile' defaultTasks: [] dependencies: org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler_Decorated@6f0cb5a1 depth: 0 description: null ext: org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension@1b29d52b extensions: org.gradle.api.internal.plugins.DefaultConvention@66e8997c fileOperations: org.gradle.api.internal.file.DefaultFileOperations@47547132 fileResolver: org.gradle.api.internal.file.BaseDirFileResolver@655523dd gradle: build 'gradle' group: helloWorld: task ':helloWorld' inheritedScope: org.gradle.api.internal.ExtensibleDynamicObject$InheritedDynamicObject@6f7e336b logger: org.gradle.api.logging.Logging$LoggerImpl@3a2b2322 logging: org.gradle.logging.internal.DefaultLoggingManager@5e1218b4 modelRegistry: org.gradle.model.internal.registry.DefaultModelRegistry@12958360 module: org.gradle.api.internal.artifacts.ProjectBackedModule@62d0ac62 name: gradle parent: null parentIdentifier: null path: : plugins: [org.gradle.api.plugins.HelpTasksPlugin@4d7e7435] processOperations: org.gradle.api.internal.file.DefaultFileOperations@47547132 project: root project 'gradle' projectDir: H:\Works\TEMP\gradle projectEvaluationBroadcaster: ProjectEvaluationListener broadcast projectEvaluator: org.gradle.configuration.project.LifecycleProjectEvaluator@c6e0f32 projectRegistry: org.gradle.api.internal.project.DefaultProjectRegistry@6f3f0fae properties: {...} repositories: [] resources: org.gradle.api.internal.resources.DefaultResourceHandler@21a66d45 rootDir: H:\Works\TEMP\gradle rootProject: root project 'gradle' scriptHandlerFactory: org.gradle.api.internal.initialization.DefaultScriptHandlerFactory@1f966492 scriptPluginFactory: org.gradle.configuration.DefaultScriptPluginFactory@63fdffcd serviceRegistryFactory: org.gradle.internal.service.scopes.ProjectScopeServices$5@7428de63 services: ProjectScopeServices standardOutputCapture: org.gradle.logging.internal.DefaultLoggingManager@5e1218b4 state: project state 'EXECUTED' status: release subprojects: [] tasks: [task ':copyFile', task ':helloWorld', task ':properties'] version: unspecified BUILD SUCCESSFUL Total time: 2.03 secs
在以上Property中,allprojects表示所有的Project,这里只包含一个根Project,在多项目构建中,它将包含多个Project;buildDir表示构建结果的输出目录;我们自己定义的helloWorld和copyFile也成为了Project中的Property。另外,Project还包括用于执行Ant命令的DefaultAntBuilder(Property名为ant)和Project的描述属性description。
在下一篇文章中,我们将讲到创建Task的多种方法。
来源: http://www.cnblogs.com/CloudTeng/p/3417762.html
相关推荐
在“SpringMVC学习(一)——SpringMVC入门小程序”中,我们首先会接触到SpringMVC的基本概念。这通常包括以下几个核心组件: 1. **DispatcherServlet**:这是SpringMVC的前端控制器,负责接收HTTP请求,并根据配置...
**Gradle**是一种基于Java的构建工具,它采用了一种灵活的DSL(领域特定语言)——Groovy,来定义项目构建逻辑。Gradle旨在提高构建过程的效率与灵活性,并支持多样的构建场景。 #### 二、Gradle的特点 1. **强大...
**Spring Security 3 系列文章——入门篇(一)** Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,广泛应用于Java企业级应用和Spring Boot项目中。本篇将作为Spring Security 3的入门介绍,帮助...
本资料“Android编程快速入门——字节跳动”旨在帮助新手理解Android开发的基础概念,并提供实际操作的指导。 一、Android简介 Android是由Google领导的开放源代码操作系统,广泛应用于智能手机和平板电脑。它基于...
【Android Studio应用开发——基础入门与应用实战】是针对初学者和希望提升Android应用程序开发技能的人群设计的一门课程。这门课程由专家方欣和杨勃共同编写,旨在通过电子课件的形式,深入浅出地讲解Android ...
【MyBatis入门】—— 第一个MyBatis应用 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解...
它包含了诸如编译、测试、打包、部署等一系列与Gaelyk项目相关的任务,使得开发者无需手动配置这些繁琐的步骤,只需通过简单的命令即可完成整个构建过程。这极大地提高了开发效率,减少了出错的可能性。 插件的核心...
通过学习《网络程序设计——JSP从入门到精通》,读者可以系统地掌握JSP的各个方面,从基础语法到高级特性,再到实际项目开发,逐步成为一名熟练的JSP开发者。书中提供的PDG格式阅读器可以帮助读者方便地阅读和学习这...
Mybatis是一款优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。本教程将引导你逐步了解并掌握Mybatis的基础知识,让你在Java开发中更加游刃有余地处理数据库操作。 首先,我们需要理解Mybatis的核心...
这篇博客“【MyBatis入门】—— MyBatis日志”旨在帮助初学者理解如何在MyBatis中配置和使用日志功能,以便于调试和优化应用程序。 在MyBatis中,日志系统对于跟踪SQL语句和参数,以及检查执行效率至关重要。...
这个压缩包包含了一系列的思维导图,涵盖了从基础到高级,从进阶到架构,再到底层技术和扩展应用的全方位Java学习图谱。下面,我们将根据这些文件名称,详细探讨Java工程师在各个阶段所需掌握的知识点。 首先,...
NDK简单Demo,主要使用的是c语言,gradle-experimental插件。
本案例将引导你快速入门SSM开发,让我们一起深入理解这三个组件的核心概念和实践步骤。 **Spring框架** Spring是Java企业级应用的核心框架,它提供了依赖注入(DI)和面向切面编程(AOP)等核心特性。在本案例中,...
在现代Web开发中,安全问题始终是开发者需要关注的核心问题之一。Spring框架提供了强大的安全模块——Spring Security,它为开发者提供了全面的认证和授权功能,帮助构建安全的Web应用程序。Spring Starter Security...
AOP提供了一种模块化业务逻辑的新方法,使我们可以定义“切面”——包含关注点的模块,如日志、事务管理等,并将其与主要业务逻辑分离。Spring AOP支持在运行时织入切面,降低了代码的复杂性。 4. **Spring MVC**...
本篇将深入讲解Struts2的基础知识和配置过程,帮助初学者快速入门。 首先,理解Struts2的核心概念是至关重要的。Struts2框架基于拦截器模型,通过一系列拦截器堆栈来处理HTTP请求,这些拦截器负责执行如验证、异常...
"初学者必看的JAVA开发入门(源代码)"是一个贴心的学习资料包,它包含了作者在学习Java过程中积累的源代码,以及相关的学习文档,帮助初学者更好地理解并实践Java编程。 Java是一种广泛应用于企业级应用、移动应用...
开发者还需要熟悉Gradle构建系统和Android Debug Bridge (ADB)工具。 2. **典型的移动游戏特性**:移动游戏有其独特性,如碎片化时间的利用、触摸屏交互、网络同步、资源优化和多平台兼容。了解这些特性有助于设计...
本项目实战将带领你逐步完成一个简单的NDK项目,通过实践学习如何创建原生库、定义JNI接口、编译和调试原生代码,以及如何在Java层调用这些接口。通过这个过程,你将深入了解Android NDK的运作机制,为后续的高级...