Maven和Gradle区别

分享知识 传递快乐


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


依赖管理系统

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

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
</dependency>

从上面可以看出当引用一个依赖时,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中可以使用<modules>标签来定义一组子模块。parent POM不会有什么实际构建产出。而parent POM中的build配置以及依赖配置都会自动继承给子module。

maven创建多模块

maven父工程pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.xh</groupId>
	<artifactId>ssm</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	<name>ssm</name>


	<modules>
		<module>ssm-mapper</module>
		<module>ssm-service</module>
		<module>ssm-web</module>
	</modules>

	<properties>
		<module.name>${project.artifactId}</module.name>
		<project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
		<spring.version>4.3.13.RELEASE</spring.version>
	</properties>

	<dependencies>
		<!-- spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${spring.version}</version>
		</dependency>
		
		.......
	</dependencies>
</project>

maven子工程pom.xml

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.xh</groupId>
		<artifactId>ssm</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<groupId>com.xh.ssm.web</groupId>
	<artifactId>ssm-web</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>ssm-web Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<dependencies>
		<!-- 引入ssm-service项目,这样项目ssm-web就可以调用ssm-service里边的类了 -->
		<dependency>
			<groupId>com.xh.ssm.service</groupId>
			<artifactId>ssm-service</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>

	<!-- 打包时把需要的xml文件一块打进去 -->
	<!-- 不配置以下内容,项目在tomcat下会报找不文件等错误 -->
	<build>
		<finalName>${project.name}</finalName>
		<resources>
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**/*.properties</include>
					<include>**/*.xml</include>
				</includes>
				<filtering>true</filtering>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
				<includes>
					<include>**</include>
				</includes>
				<filtering>true</filtering>
			</resource>
		</resources>
		<pluginManagement>
			<plugins>
				<!-- 编译Java源码,一般只需设置编译的jdk版本 -->
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.6.0</version>
					<configuration>
						<source>1.8</source>
						<target>1.8</target>
						<encoding>UTF-8</encoding>
						<testIncludes>
							<testInclude>none</testInclude>
						</testIncludes>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
</project>

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

gradle创建多模块

第一种:

1、创建多个独立gradle项目

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、结果

 

第二种:

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、新建空文件夹

4、将项目转换成Gradle项目

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

 

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

 

 

 

 

 

 

 

 

 

 

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野历程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值