Maven和Gradle区别

分享知识 传递快乐


Java中主要有三大构建工具:Ant、Maven和Gradle。Ant用的比较少、Maven用的相对普遍,而Gradle的发展则将是未来的一种趋势。使用Maven需要有pom.xml文件,使用Gradle需要有一个对应的build.gradle文件。


依赖管理系统

Maven中用groupId、artifactId、version组成的Coordination(坐标)唯一标识一个依赖。任何基于Maven构建的项目自身也必须定义这三项属性,生成的包可以是Jar包,也可以是war包。一个典型的依赖引用如下所示:


    junit
    junit
    4.12
    test


    org.springframework
    spring-test

从上面可以看出当引用一个依赖时,version可以省略掉,这样在获取依赖时会选择最新的版本。而存储这些组件的仓库有远程仓库和本地仓库之分。远程仓库可以使用世界公用的central仓库,也可以使用Apache Nexus自建私有仓库;本地仓库则在本地计算机上。通过Maven安装目录下的settings.xml文件可以配置本地仓库的路径,以及采用的远程仓库的地址。

Gradle在设计的时候基本沿用了Maven的这套依赖管理体系。然后我将其转换成Gradle脚本,结果是惊人,在引用依赖方面变得非常简洁。

dependencies {
    compile 'org.hibernate:hibernate-core:3.6.7.Final'
    testCompile ‘junit: junit: 4. + '
}

Maven和Gradle对依赖项的scope有所不同。在Maven世界中,一个依赖项有6种scope,分别是complie(默认)、provided、runtime、test、system、import。而grade将其简化为了4种,compile、runtime、testCompile、testRuntime。

Gradle支持动态的版本依赖。在版本号后面使用+号的方式可以实现动态的版本管理。

Maven中央仓库已经成为了Java开发者不可或缺的资源,Gradle既然有依赖管理,那必然也得用到仓库,这当然也包括了Maven中央仓库,就像这样:

repositories {
    mavenLocal()
    mavenCentral()
    mavenRepo urls: "http://repository.sonatype.org/content/groups/forge/"
}

多模块构建

Maven将一个项目分解为多个模块已经是很通用的一种方式,在Maven中需要定义个parent POM作为一组module的聚合POM。在该POM中可以使用标签来定义一组子模块。parent POM不会有什么实际构建产出。而parent POM中的build配置以及依赖配置都会自动继承给子module。

maven创建多模块

maven父工程pom.xml



	4.0.0
	com.xh
	ssm
	0.0.1-SNAPSHOT
	pom
	ssm


	
		ssm-mapper
		ssm-service
		ssm-web
	

	
		${project.artifactId}
		utf-8
		4.3.13.RELEASE
	

	
		
		
			org.springframework
			spring-aop
			${spring.version}
		
		
			org.springframework
			spring-aspects
			${spring.version}
		
		
		.......
	

maven子工程pom.xml



	4.0.0
	
		com.xh
		ssm
		0.0.1-SNAPSHOT
	
	com.xh.ssm.web
	ssm-web
	0.0.1-SNAPSHOT
	war
	ssm-web Maven Webapp
	http://maven.apache.org

	
		
		
			com.xh.ssm.service
			ssm-service
			0.0.1-SNAPSHOT
		
	

	
	
	
		${project.name}
		
			
				src/main/java
				
					**/*.properties
					**/*.xml
				
				true
			
			
				src/main/resources
				
					**
				
				true
			
		
		
			
				
				
					org.apache.maven.plugins
					maven-compiler-plugin
					3.6.0
					
						1.8
						1.8
						UTF-8
						
							none
						
					
				
			
		
	

而Gradle也支持多模块构建。而在parent的build.gradle中可以使用allprojects和subprojects代码块来分别定义里面的配置是应用于所有项目还是子项目。对于子模块的定义是放置在setttings.gradle文件中的。在gradle的设计当中,每个模块都是Project的对象实例。而在parent build.gradle中通过allprojects或subprojects可以对这些对象进行各种操作。这无疑比Maven要灵活的多。

gradle创建多模块

第一种:

1、创建多个独立gradle项目

Maven和Gradle区别_第1张图片

2、编辑模块gradle-api的settings.gradle文件:

rootProject.name = 'gradle-api'

include ':gradle-core'
project(':gradle-core').projectDir = new File(settingsDir, '../gradle-core')

3、编辑模块gradle-api的build.gradle文件:

apply plugin: "java" //Java的JDK
apply plugin: "eclipse" //eclipse项目插件
apply plugin: "war" //项目构建输出war

repositories {
    // Use jcenter for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {
   compile project(':gradle-core')
}

4、完成后,执行 Gradle  -> Refresh Gradle Project

5、结果

Maven和Gradle区别_第2张图片

 

第二种:

1.新建Java项目

2.添加build.gradle、settings.gradle文件

build.gradle

subprojects {
	apply plugin: "java" //Java的JDK

}

settings.gradle
 

rootProject.name = 'gradle-parent'

include 'gradle-core'

3、新建空文件夹

Maven和Gradle区别_第3张图片

4、将项目转换成Gradle项目

Maven和Gradle区别_第4张图片

Maven和Gradle区别_第5张图片

5、复制项目路径,右击gradle-parent,导入Gradle项目

Maven和Gradle区别_第6张图片

 

总的来说,gradle相比于maven有很大的灵活性,目前gradle的使用者越来越多。而由于maven之前处于主流,并且在某些方面maven较gradle还有一些优点,所以maven和gradle并存。在github上大多数优秀的开源项目会同时提供maven和gradle两种添加依赖的方式。

 

 

 

 

 

 

 

 

 

 

———————————
相互学习,共同进步
如有不足请留言指正

你可能感兴趣的:(Maven,Gradle构建,Maven构建,Maven和Gradle区别,多模块构建,构建工具)