CS-Notes/notes/构建工具.md
2019-07-13 23:30:43 +08:00

5.4 KiB
Raw Blame History

一、构建工具的作用

构建工具是用于构建项目的自动化工具,主要包含以下工作:

依赖管理

不再需要手动导入 Jar 依赖包,并且可以自动处理依赖关系,也就是说某个依赖如果依赖于其它依赖,构建工具可以帮助我们自动处理这种依赖关系。

运行单元测试

不再需要在项目代码中添加测试代码,从而避免了污染项目代码。

将源代码转化为可执行文件

包含预处理、编译、汇编、链接等步骤。

将可执行文件进行打包

不再需要使用 IDE 将应用程序打包成 Jar 包。

发布到生产服务器上

不再需要通过 FTP 将 Jar 包上传到服务器上。

二、Java 主流构建工具

Ant 具有编译、测试和打包功能,其后出现的 Maven 在 Ant 的功能基础上又新增了依赖管理功能,而最新的 Maven 又在 Maven 的功能基础上新增了对 Groovy 语言的支持。


Gradle 和 Maven 的区别是,它使用 Groovy 这种特定领域语言DSL来管理构建脚本而不再使用 XML 这种标记性语言。因为项目如果庞大的话XML 很容易就变得臃肿。

例如要在项目中引入 JunitMaven 的代码如下:

<?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>jizg.study.maven.hello</groupId>
   <artifactId>hello-first</artifactId>
   <version>0.0.1-SNAPSHOT</version>

   <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>4.10</version>
               <scope>test</scope>
          </dependency>
   </dependencies>
</project>

而 Gradle 只需要几行代码:

dependencies {
    testCompile "junit:junit:4.10"
}

三、Maven

概述

提供了项目对象模型POM文件来管理项目的构建。

仓库

仓库的搜索顺序为:本地仓库、中央仓库、远程仓库。

  • 本地仓库用来存储项目的依赖库;
  • 中央仓库是下载依赖库的默认位置;
  • 远程仓库,因为并非所有的依赖库都在中央仓库,或者中央仓库访问速度很慢,远程仓库是中央仓库的补充。

POM

POM 代表项目对象模型,它是一个 XML 文件,保存在项目根目录的 pom.xml 文件中。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

[groupId, artifactId, version, packaging, classifier] 称为一个项目的坐标,其中 groupId、artifactId、version 必须定义packaging 可选(默认为 Jarclassifier 不能直接定义的,需要结合插件使用。

  • groupId项目组 Id必须全球唯一
  • artifactId项目 Id即项目名
  • version项目版本
  • packaging项目打包方式。

依赖原则

1. 依赖路径最短优先原则

A -> B -> C -> X(1.0)
A -> D -> X(2.0)

由于 X(2.0) 路径最短,所以使用 X(2.0)。

2. 声明顺序优先原则

A -> B -> X(1.0)
A -> C -> X(2.0)

在 POM 中最先声明的优先,上面的两个依赖如果先声明 B那么最后使用 X(1.0)。

3. 覆写优先原则

子 POM 内声明的依赖优先于父 POM 中声明的依赖。

解决依赖冲突

找到 Maven 加载的 Jar 包版本,使用 mvn dependency:tree 查看依赖树,根据依赖原则来调整依赖在 POM 文件的声明顺序。

参考资料

微信公众号

更多精彩内容将发布在微信公众号 CyC2018 上,你也可以在公众号后台和我交流学习和求职相关的问题。另外,公众号提供了该项目的 PDF 等离线阅读版本,后台回复 "下载" 即可领取。公众号也提供了一份技术面试复习大纲,不仅系统整理了面试知识点,而且标注了各个知识点的重要程度,从而帮你理清多而杂的面试知识点,后台回复 "大纲" 即可领取。我基本是按照这个大纲来进行复习的,对我拿到了 BAT 头条等 Offer 起到很大的帮助。你们完全可以和我一样根据大纲上列的知识点来进行复习,就不用看很多不重要的内容,也可以知道哪些内容很重要从而多安排一些复习时间。