Maven VS Gradle

来源:互联网 发布:主力如何拉升股价 知乎 编辑:程序博客网 时间:2024/05/21 05:20

依赖管理

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过程进行更细致的自定义控制,这个功能对于复杂的项目来说非常有用。





原创粉丝点击