Maven VS Gradle

依赖管理

1. 依赖定义

groupId、artifactId、version. 三个属性定义一个依赖,version可以省略
 
gradel相对简洁,举例如下:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.5</version>
</dependency>


gradle如下:
compile group: 'org.mybatis', name: 'mybatis', version: '3.4.5‘
或者
compile'org.hibernate:hibernate-core:3.6.7.Final'

2. 范围

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

多模块构建

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

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

比如在parent的build.gradle中有以下代码:

1
2
3
allprojects {
  task hello << { task -> println "I'm $task.project.name" }
}

执行命令gradle -q hello会依次打印出父module以及各个submodule的项目名称。这种强大的能力能让gradle对各个模块具有更强的定制化。

maven定义一个parent pom 文件,里面定义了所有的子module,并且其他插件配置对所有子模块都生效。
相比一些,根目录的build.gradle 可以利用allprojects或者subprojects对sub module 进行个性化定制。
gradle的子模块定义都是在settings.gradle中。


插件引入
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version> 1.2 </version>
  <executions>
  <execution>
  <id>drop DB => db_name</id>
  <phase>pre-integration-test</phase>
  <goals>
  <goal>exec</goal>
  </goals>
  <configuration>
  <executable>curl</executable>
  <arguments>
  <argument>-s</argument>
  <argument>-S</argument>
  <argument>-X</argument>
  <argument>DELETE</argument>
  <argument>http: //${db.server}:${db.port}/db_name</argument>
  </arguments>
  </configuration>
  </execution>
  </executions>
</plugin>
gradle语法非常简洁,不受制于xml格式

task dropDB(type: Exec) {
  commandLine ‘curl’,’-s’,’s’,’-x’,’DELETE’, "http://${db.server}:{db.port}/db_name"
}

Maven使用的是XML,受限于XML的表达能力以及XML本身的冗余,会使pom.xml文件显得冗长而笨重。而Gradle是基于Groovy定义的一种DSL语言,简洁并且表达能力强大。在Maven中,任何扩展都需要通过Maven插件实现,但Gradle的配置文件本身就是一种语言,可以直接依赖任意Java库,可以直接在build.gradle文件中像Ant一样定义task,比Ant的表达能力更强(Ant本身也是XML定义的)。

Gradle的配置文件中可以直接获取到Project对象以及环境变量,可以通过程序对build过程进行更细致的自定义控制,这个功能对于复杂的项目来说非常有用。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值