一般面试中被问到的项目构建工具,常常会回答的是Maven
今天大概了解了一下目前项目构建构建有Maven,Ant,Gradle
Gradle 是一个构建工具,它是用来帮助我们构建app的,构建包括编译,打包等过程。我们可以为Gradle指定构建规则,然后他就会根据我们的命令自动为我们构建app。
Gradle配置文件
在Android Studio中新建一个工程,可以得到如下的工程结构图:
Android Studio中的一个Module即为Gradle中的一个Project。上图的app目录下,存在一个build.gradle文件,代表了app Module的构建脚本,它定义了应用于本模块的构建规则。我们可以看到,工程根目录下也存在一个build.gradle文件,它代表了整个工程的构建,其中定义了适用于这个工程中所有模块的构建规则。
Maven配置
如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。
以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。
而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率
- Maven基本命令
-v:查询Maven版本
本命令用于检查maven是否安装成功。
Maven安装完成之后,在命令行输入mvn -v,若出现maven信息,则说明安装成功。
compile:编译
将java源文件编译成class文件
test:测试项目
执行test目录下的测试用例
package:打包
将项目打成jar包
clean:删除target文件夹
install:安装
将当前项目放到Maven的本地仓库中。供其他项目使用
- 什么是Maven仓库?
Maven仓库用来存放Maven管理的所有Jar包。分为:本地仓库 和 中央仓库。
本地仓库:Maven本地的Jar包仓库。
中央仓库: Maven官方提供的远程仓库
- 依赖冲突
若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。
1.短路优先
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar
若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。
在此时,Maven只会引用引用路径最短的Jar。
2.声明优先
若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。
聚合
-
什么是聚合?
将多个项目同时运行就称为聚合。
-
如何实现聚合?
只需在pom中作如下配置即可实现聚合:
<modules> <module>web-connection-pool</module> <module>web-java-crawler</module> </modules>
继承
-
什么是继承?
-
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。
-
如何实现继承?
-
父pom配置:将需要继承的Jar包的坐标放入标签即可
<dependencyManagement> <dependencies> <dependency> <groupId>cn.missbe.web.search</groupId> <artifactId>resource-search</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </dependencyManagement>
子pom配置
-
<parent> <groupId>父pom所在项目的groupId</groupId> <artifactId>父pom所在项目的artifactId</artifactId> <version>父pom所在项目的版本号</version> </parent> <parent> <artifactId>resource-search</artifactId> <groupId>cn.missbe.web.search</groupId> <version>1.0-SNAPSHOT</version> </parent>
Ant 构建
基于另一个构建文件中的一个目标调用Ant从而可以将构建文件分解为多个Ant构建文件,它会实例化一个新的Ant工程。属性值能在新ant工程中使用。如果需要在一个构件文件中通过Ant命令去执行另一个Ant项目,或者说要执行本项目的子项目的构件文件。这时Ant这个核心任务就派上用场了。简单地说Ant任务的作用就相当于在命令行通过Ant命令执行构件文件。值得注意的是Ant任务依赖于target元素,需要在某个target元素中使用,不能在target元素外独立使用。
ant项目的结构如下:
project-root/
├── src/
│ ├── java/ # Java源码
│ └── resources/ # 资源文件(如配置文件)
├── lib/ # 第三方库(JAR文件)
├── web/ # Web资源(如JSP文件)
│ ├── WEB-INF/
│ │ ├── lib/ # Web应用库
│ │ ├── web.xml # Web应用配置文件
│ │ └── classes/ # 编译后的类文件
├── build/ # Ant构建输出目录
└── build.xml # Ant构建脚本