返回

Maven和Gradle区别

发布时间:2023-02-06 12:04:22 262
# webkit# apache# git# eclipse# 脚本

分享知识 传递快乐

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中可以使用标签来定义一组子模块。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项目

Maven和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

Maven和Gradle区别_Maven和Gradle区别_02

5、结果

Maven和Gradle区别_Gradle构建_03

 

第二种:

1.新建Java项目

Maven和Gradle区别_Gradle构建_04

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区别_Maven构建_05

4、将项目转换成Gradle项目

Maven和Gradle区别_Gradle构建_06

Maven和Gradle区别_Maven构建_07

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

Maven和Gradle区别_Maven构建_08

 

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

 

 

 

 

 

 

 

 

 

 

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

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
Python Selenium滚动页面定位元素位置 2023-02-06 11:52:08