一、介绍
关于Gradle是什么东西,这里也不用介绍了,类似于Maven,不过自己Maven用的也不深,无法对比区别有多大,但是看到Gradle的官网上面的User Guide,介绍的篇幅很大,功能估计很多,想要深入使用也要花很多时间。
https://docs.gradle.org/current/userguide/userguide.html
二、安装:
其实类似Maven的安装方式,先下载,后解压。
下载地址:http://gradle.org/gradle-download/
解压后,在 我的电脑 -> 属性 -> 高级系统设置 -> 环境变量 ,添加一个系统变量GRADLE_HOME,变量值为解压缩路径,如:E:\eclipse\gradle-2.6
在path中添加 %GRADLE_HOME%\bin ,完成安装。
win+r,后cmd,输入gradle -v,
安装完毕。
三、Gradle一些概念
1、在Gradle中,有两个基本概念:项目和任务。请看以下详解:
- 项目是指我们的构建产物(比如Jar包)或实施产物(将应用程序部署到生产环境)。一个项目包含一个或多个任务。
- 任务是指不可分的最小工作单元,执行构建工作(比如编译项目或执行测试)。build,test之类的命令?
那么,这些概念和Gradle的构建又有什么联系呢?好,每一次Gradle的构建都包含一个或多个项目。
下面这张图展示了上面所谈到的这些概念的关系。
2、3个配置文件
我们能够使用以下配置文件对Gradle的构建进行配置:
- Gradle构建脚本(build.gradle)指定了一个项目和它的任务。
- Gradle属性文件(gradle.properties)用来配置构建属性。
- Gradle设置文件(gradle.settings)对于只有一个项目的构建而言是可选的,如果我们的构建中包含多于一个项目,那么它就是必须的,因为它描述了哪一个项目参与构建。每一个多项目的构建都必须在项目结构的根目录中加入一个设置文件。
3、相关插件
有用的特性都由插件提供。插件能够做到:添加新任务、为新加入的任务提供默认配置(默认配置会在项目中注入新的约定)、加入新的属性,可以覆盖插件的默认配置属性、为项目加入新的依赖
四、使用
1、我们可以手动建立一个项目
比如在 E:\Gradle\workspace\gradle_demo ,项目名称hello_gradle,项目中新建一个文件build.gradle,目前项目就只有这个文件。
在build.gradle文件中添加改行,加入 java 插件,
apply plugin: 'java'
apply plugin: 'java'
加入插件后,可以方便我们对项目进行构建;
2、手动建立项目工程文件:
src\main\java
src\main\resources
src\test\java
src\test\resources
执行gradle build 构建。
可以看到,在build文件中,libs生成了xxx.jar 文件。
3、添加java文件并测试。
在src\main\java 中,添加包com.demo,并添加HelloWorld.java文件
package com.demo;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
package com.demo;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
执行gradle assemble ,编译打包项目,使用上面提到的gradle build ,同样可以编译打包项目,区别在于:
Java插件在我们的构建中加入了很多任务,我们这篇教程涉及到的任务如下:
- assemble任务会编译程序中的源代码,并打包生成Jar文件,这个任务不执行单元测试。
- build任务会执行一个完整的项目构建。
- clean任务会删除构建目录。
- compileJava任务会编译程序中的源代码。
现在进入build->libs 执行 java -jar hello_gradle.jar 提示
问题出在,我们没有在manifest文件中配置Jar文件的主类。解决这个问题的关键
上面已经说了,在build.gradle文件中加入如下代码
jar {
manifest {
attributes 'Main-Class': 'com.demo.HelloWorld'
}
}
jar {
manifest {
attributes 'Main-Class': 'com.demo.HelloWorld'
}
}
然后先执行 gradle clean ,删除构建目录。
在执行 gradle build ,构建项目
成功打印出。
4、添加依赖,这里使用Maven central仓库
1)、在build.gradle文件中,添加下面代码
repositories {
mavenCentral()
}
repositories {
mavenCentral()
}
2)、然后声明依赖:
在build.gradle文件中,我们声明了两个依赖:
- Log4j(版本1.2.17)用来记录日志。
- JUnit(版本4.11)用来编写单元测试。
dependencies {
compile 'log4j:log4j:1.2.17'
testCompile 'junit:junit:4.11'
}
dependencies {
compile 'log4j:log4j:1.2.17'
testCompile 'junit:junit:4.11'
}
3)、编写代码
首先,在src/main/java/com/demo目录下新建一个MessageService类并加以实现,代码如下:
package com.demo;
public class MessageService {
public String getMessage() {
return "Hello World!";
}
}
package com.demo;
public class MessageService {
public String getMessage() {
return "Hello World!";
}
}
其次,在src/main/test/com/demo目录下新建一个MessageServiceTest类,编写单元测试,代码如下:
package com.demo;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class MessageServiceTest {
private MessageService messageService;
@Before
public void setUp() {
messageService = new MessageService();
}
@Test
public void getMessage_ShouldReturnMessage() {
assertEquals("Hello World!", messageService.getMessage());
}
}
package com.demo;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class MessageServiceTest {
private MessageService messageService;
@Before
public void setUp() {
messageService = new MessageService();
}
@Test
public void getMessage_ShouldReturnMessage() {
assertEquals("Hello World!", messageService.getMessage());
}
}
第三,在src/main/java/com/demo目录下新建一个HelloWorld类,这是程序的主类,从MessageService对象获取信息,并使用Log4j写入日志,代码如下:
package com.demo;
import org.apache.log4j.Logger;
public class HelloWorld {
private static final Logger LOGGER = Logger.getLogger(HelloWorld.class);
public static void main(String[] args) {
MessageService messageService = new MessageService();
String message = messageService.getMessage();
LOGGER.info("Received message: " + message);
}
}
package com.demo;
import org.apache.log4j.Logger;
public class HelloWorld {
private static final Logger LOGGER = Logger.getLogger(HelloWorld.class);
public static void main(String[] args) {
MessageService messageService = new MessageService();
String message = messageService.getMessage();
LOGGER.info("Received message: " + message);
}
}
第四,在src/main/resources目录中,使用log4j.properties配置log4j,log4j.properties文件如下:
log4j.appender.Stdout=org.apache.log4j.ConsoleAppender
log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.Stdout.layout.conversionPattern=%-5p - %-26.26c{1} - %m\n
log4j.rootLogger=DEBUG,Stdout
log4j.appender.Stdout=org.apache.log4j.ConsoleAppender
log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.Stdout.layout.conversionPattern=%-5p - %-26.26c{1} - %m\n
log4j.rootLogger=DEBUG,Stdout
执行编译打包 gradle build
执行 gradle test
我们可以看到,在build->reports->tests文件夹中,会生成test的报告
执行 java -jar hello_gradle.jar后,出现下面错误,该问题原因是由于项目依赖了log4j 和 junit ,编译打包项目并没有把这两个包也打包进项目。
在build.gradle中,加入如下代码即可。
jar {
from { configurations.compile.collect { it.isDirectory()? it :zipTree(it)}}
}
jar {
from { configurations.compile.collect { it.isDirectory()? it :zipTree(it)}}
}
成功打印。
5、多项目构建