在这里,我通过在IDEA中创建简单的HelloWord开始,比较Gradle与传统的Maven有什么不同。
创建Gradle HelloWord
创建Gradle项目
打开IDEA,点击Create New Project
选中右侧的Gradle,在左侧选中Java,点击【Next】
在这里,输入自定义的GroupId与ArtifactId,与Maven一样,GroupId一般为公司域名的反写,而ArtifactId为项目为-
模块名。我这里输入的GroupId为com.lyc
,输入的ArtifactId为gradle-demo
,点击【Next】
在这里,我们不用IDEA默认的gradle,我们选择自己配置的。选中图示中的选项,由于我们之前已经配置了Gradle的环境变量,所以说IDEA可以直接将本地已经搭建的Gradle查找并加载进来。点击【Next】
在这里,我们可以修改我们自定义的工作空间,然后点击【Finish】
如下的项目结构就是典型的Gradle的项目结构:
.gradle
为Gradle项目的配置文件.idea
为IDEA这种IDE开发工具所生成的配置文件。
上述两种配置文件都是以.
来进行开头的,而该命名方式的文件夹在Linux操作系统中是系统默认的隐藏文件夹,所以说这两种文件夹基本上是不需要我们去进行关注的。
src
是项目源码的存放位置build.gradle
是Gradle的项目配置文件,这里由Gradle的坐标,仓库,依赖,插件等settings.gradle
是Gradle项目及其子项目的依赖关系
编写HelloWorld测试文件
build.gradle
group 'com.lyc'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile 'org.projectlombok:lombok:1.16.20'
compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.10.0'
compile 'org.apache.logging.log4j:log4j-core:2.10.0'
}
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %5p %t %-5l - %m%n"/>
</Console>
</appenders>
<loggers>
<root level="trace">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
Person
package com.lyc;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@Builder
@ToString
public class Person {
private int id;
private String name;
public String say(){
return "Hello World!";
}
}
PersonTest
package com.lyc;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@Slf4j
public class PersonTest {
private Person person = null;
@Before
public void init(){
person = Person.builder()
.id(1)
.name("zhangsan")
.build();
}
@Test
public void test(){
log.info(person.toString());
Assert.assertEquals("Hello World!",person.say());
}
}
编写完之后的项目结构为:
创建Maven HelloWord
创建与Gradle HelloWord对应的Maven文件,其结构为:
测试
Maven HelloWord测试
Maven版本的测试比较的简单,就是直接在PersonTest
文件中运行对应的test()
方法,其运行的结果为:
Gradle HelloWord测试
如果要是直接在Gradle项目中像在Maven项目中一样运行,那出现的结果将是:
在代码的编辑区,代码不会报错,但是在控制台中,却显示Error信息。
真实的运行方式是在IDE的右侧,点击图示的Build执行代码编译操作:
项目正常编译的结果:
在项目编译成功后,其在项目的结构中会生成build
文件目录,在该目录下将会展示一系列的构建结果,其中的reports
文件夹下则是存放的此次构建的测试报告,如下所示:
用浏览器打开上图中的index.html文件,其展示的效果如下:
通过点击com.lyc
->PersonTest
打开如下所示界面
点击上图中的Standard output
按钮,其执行的结果如下:
Gradle项目与Maven项目的不同
项目结构不同
Maven项目
在Maven项目中,所有的构建结果都在target
文件夹下,其中classes
文件夹下存放的是项目编译之后的字节码文件,而在test-classes
中存放的则是项目的测试代码编译文件。
Gradle项目
在Gradle项目中,会在项目结构中生成build
和out
两个文件夹,无论在哪个文件夹下,其都有项目的编译文件。其中重点在build
文件夹,其中的classes
是java编译之后的子节码文件,libs
是jar包所存放的位置,reports
是项目测试报告resources
是项目的资源文件,如下所示:
依赖坐标的不同
在Maven中的依赖
在Maven中的依赖坐标主要有三部分组成,分别为:groupId
,artifactId
,version
,其中scope
是作用域,就是指定该依赖的生存范围。
groupId
是公司名的反写artifactId
是项目名+模块名version
是版本号scope
是作用域
举例,在Maven中引入junit:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
在Gradle中的依赖
在Gradle中的依赖坐标也是有三部分组成,分别为:group
,name
,version
由于Gradle支持Maven中央仓库,所以说在这里group
等价于groupId
;name
等价于artifactId
;version
连名字都相同,所以说用法也相同。而在Gradle中compile
等价于dependency
,testCompile
等价于Maven中的dependency
加<scope>test</scope>
。
举例,在Gradle中引入junit:
testCompile group: 'junit', name: 'junit', version: '4.12'
由于Gradle是比Maven后出,同时Gradle在继承了Maven的功能后又实现了很多新特性,比如说简化代码,所以说即便是上面的引入junit依赖,我们仍可以进一步的简化为:
testCompile 'junit:junit:4.12'
项目源码:gradle-demo