Hi! 我是小小,今天是本周的第一篇,本周第一篇主要内容是maven项目的创建和使用。

前言

为了持续集成和持续部署,需要把项目改造为,或者使用maven创建项目,下面介绍maven

为什么要使用maven

在开发中经常需要依赖第三方包,包与包之间存在依赖关系,版本之间存在兼容问题,还有需要把包进行升级和降级,当项目复杂到了一定程度的时候,需要对包进行管理。maven是当前最受欢迎的自动化综合工具,类似的还有ant,npm,nuget,composer。maven提供了开发人员构建一个完整生命周期的框架,开发团队可以自动化的完成项目的基础工具建设,maven使用标准目录结构和默认构建生命周期, 因此maven是一个项目管理工具。主要做了以下几件事情

  1. 统一开发规范与工具。

  2. 统一管理jar包

maven生命周期

maven把项目构建划分为不同的生命周期,它这个过程包括编译,测试,打包,集成测试,验证,部署,maven的所有执行动作都需要指明自己在这个过程的执行位置,然后在maven执行的时候,依照过程的发展依次调用包进行处理。这个是maven的一个基本的调度机制,

maven的标准工程结构

|-- pom.xml(maven的核心配置文件)
|-- src
|-- main|-- java(java源代码目录)|-- resources(资源文件目录)
|-- test|-- java(单元测试代码目录)
|-- target(输出目录,所有的输出物都存放在这个目录下)|-- classes(编译后的class文件存放处)

Maven的约定优于配置

所谓的约定优于配置,在maven中,并不是完全不可以修改,他们只是一些配置的默认值。每一个阶段的任务都知道自己要这么正确的完成自己的工作,比如compile任务就知道从src/main/java下编译所有的java文件,并把它的输出的class文件存放到target/classes文件中。对于maven来说,采用约定优于配置,可以减少工作量,降低学习成本。

Maven版本规范

groupId - 团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。一般对应着 JAVA 的包的结构。例如 org.apache artifactId - 单独项目的唯一标识符。比如我们的 tomcat, commons 等。不要在 artifactId 中包含点号(.)。version - 一个项目的特定版本。packaging - 项目的类型,默认是 jar,描述了项目打包后的输出。类型为 jar 的项目产生一个 JAR 文件,类型为 war 的项目产生一个 web 应用。

maven版本规范一般定义为

<major version>、<minor version>、<incremental version>-<qualifier>

处理逻辑的版本号为

SNAPSHOT - 这个版本一般用于开发过程中,表示不稳定的版本。
LATEST - 指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个 snapshot 版,具体看哪个时间最后。
RELEASE - 指最后一个发布版。

安装

配置环境变量

(1)解压压缩包(以 apache-maven-3.3.9-bin.zip 为例)

(2)添加环境变量 MAVEN_HOME,值为 apache-maven-3.3.9 的安装路径(3)在 Path 环境变量的变量值末尾添加%MAVEN_HOME%bin

(4)在 cmd 输入 mvn –version,如果出现 maven 的版本信息,说明配置成功。

本地仓储配置

从中央仓库下载的jar包都会统一的保存在本地仓库中,我们需要配置本地仓库的位置。在conf目录下的setting.xml文件。

第一个maven工程

在 Intellij 中创建 Maven 工程

(1)创建 Maven 工程

依次点击 File -> New -> Project 打开创建工程对话框,选择 Maven 工程。(2)输入项目信息(3)点击 Intellij 侧边栏中的 Maven 工具界面,有几个可以直接使用的 maven 命令,可以帮助你进行构建。

Maven 命令构建方式

进入工程目录,输入maven命令

使用指导

添加外部依赖 jar 包

在maven工程中添加 jar 包,只需要在 pom 文件中引入对应的标签即可。

<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.zp.maven</groupId><artifactId>MavenDemo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>MavenDemo</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><junit.version>3.8.1</junit.version></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version><scope>compile</scope></dependency></dependencies>
</project>

标签具有四个属性。

<groupId> - 项目组织唯一的标识符,实际对应 JAVA 的包的结构。
<artifactId> - 项目唯一的标识符,实际对应项目的名称,就是项目根目录的名称。
<version> - jar 包的版本号。可以直接填版本数字,也可以在 properties 标签中设置属性值。
<scope> - jar 包的作用范围。可以填写 compile、runtime、test、system 和 provided。用来在编译、测试等场景下选择对应的 classpath。

如何寻找 jar 包

在  mvnrepository.com 站点搜寻你想要的 jar 包版本

使用 maven 插件

要添加 Maven 插件,可以在 pom.xml 文件中添加标签。

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.3</version><configuration><source>1.7</source><target>1.7</target></configuration></plugin></plugins>
</build>

一次编译多个工程

需要创建一个父 maven 工程,它有两个字工程,my-app,my-webapp

+- pom.xml
+- my-app
| +- pom.xml
| +- src
|   +- main
|     +- java
+- my-webapp
| +- pom.xml
| +- src
|   +- main
|     +- webapp

app 工程的pom.xml 如下,重点在于 modules 中引入了两个子 module

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>app</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>my-app</module><module>my-webapp</module></modules>
</project>

选择编译 某某 时,会依次对它所有的 module 执行相同的操作。

如何打包一个可以直接运行的Spring Boot jar 包

可以使用 Spring-boot-maven-plugin 插件

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>

如果引入了第三方jar包,如何打包 首先,添加依赖

<dependency><groupId>io.github.dunwu</groupId><artifactId>dunwu-common</artifactId><version>1.0.0</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/dunwu-common-1.0.0.jar</systemPath>
</dependency>

然后配置插件

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions><configuration><includeSystemScope>true</includeSystemScope></configuration></plugin></plugins>
</build>

最佳实践

通过 bom 统一管理版本 使用类似 spring-boot-dependencies的方式统一管理依赖版本 spring-boot-dependencies的pom.xml的形式

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<packaging>pom</packaging><!-- 省略 --><!-- 依赖包版本管理 -->
<dependencyManagement><dependencies><!-- 省略 --></dependencies>
</dependencyManagement><build>
<!-- 插件版本管理 -->
<pluginManagement><plugins><!-- 省略 --></plugins>
</pluginManagement>
</build>
</project>

其他项目中,通过引入来管理依赖

 <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

关于作者

我是小小,一个生于二线,活在一线城市的程序猿,我是小小,我们下期再见。

小明菜市场

推荐阅读

● 缓冲区 | 没吃透Netty 缓冲区,还能算得上Java老司机?

● MySql | 为什么大家都在说 Select * 效率低

● k8s | 搞不明白为什么大家都在学习 k8s

● 对战 | RabbitMq 大战 kafka

● 执行流程 | 你真的了解Spring AOP的执行顺序吗?

给我个好看再走好吗?

重量级 | 重量级!Maven史上最全教程,看了必懂相关推荐

  1. maven添加子工程_重量级!Maven史上最全教程,看了必懂

    作者 | 小明菜市场来源 | 小明菜市场(ID:fileGeek)头图 |  CSDN 下载自东方IC 前言 为了持续集成和持续部署,需要把项目改造为,或者使用maven创建项目,下面介绍maven ...

  2. 重量级!Maven史上最全教程,看了必懂

    作者 | 小明菜市场 来源 | 小明菜市场(ID:fileGeek) 头图 |  CSDN 下载自东方IC 前言 为了持续集成和持续部署,需要把项目改造为,或者使用maven创建项目,下面介绍mave ...

  3. 新唐单片机 ICP 史上最全教程

    新唐单片机 ICP 史上最全教程 新唐单片机 ICP烧录教程 目录 新唐单片机 ICP 史上最全教程 1.ICP软件安装 2.连接设备 3.设备供电 4.开启软件 5.欢迎界面 6.补充事项 7.建立 ...

  4. linux如何解压.z文件,linux文件解压缩命令(史上最全教程)

    1. 前言 本文主要讲解linux文件解压缩命令,史上最全总结. 2. Linux如何打包目录和解包: tar cvf FileName.tar DirName 解包tar文件: tar xvf Fi ...

  5. Maven史上最全总结

    maven基础概念 参考文章:https://blog.csdn.net/wwwwwww31311/article/details/114323704 一 maven的安装配置 安装配置参考:http ...

  6. GitHub Pages + Hexo搭建个人博客网站,史上最全教程

    文章目录 一.准备工作 1. GitHub账号 2. 安装Git 3. 安装NodeJS 二.创建仓库 三.安装Hexo 四.更换主题 1. NexT 主题 2. Fluid主题 五.创建文章 六.个 ...

  7. 史上最全教程没有之一,微信小程序使用云开发解决微信支付问题,我走了几天几夜的弯路啊

    我现在用云开发平台,想实现微信支付功能: 微信支付的前提 1.你的小程序开通了支付功能或者,你的小程序关联了商户号 2.你的小程序能开通支付功能,一般都是非个人类型的小程序 准备工作 1.获取小程序的 ...

  8. Linux史上最全教程

    一. Linux简介 1.硬件和软件 我们所熟知的计算机是由硬件和软件组成. 硬件:计算机系统中由电子,机械和光电子元件等组成的各种物理装置装置的统称: 简单来说硬件就是看得见摸得到的. 软件:是用户 ...

  9. screen史上最全教程

    当我们用xshell连接远程服务器时候,可能会遇到网络问题,导致中断连接,此时我们可以使用screen软件去管理会话. 1.首先需要安装screen apt-get install screen  2 ...

最新文章

  1. 史上最强 NIO 框架,没有之一!!!
  2. putty php环境搭建,centos7(linux)系统下php搭建环境和创建laravel项目
  3. OpenGL油画效果
  4. 字节跳动屡战社交,这次抖音亲自上场了
  5. Gradle多项目构建–类似父pom的结构
  6. leetcode292. Nim 游戏
  7. springcloud 相同服务名_浅谈分布式与微服务
  8. composer中文阿里云镜像地址
  9. linux基本命令示例_Linux正常运行时间命令示例
  10. android 下载网络图片并缓存
  11. 编译问题处理:undefined symbol: OPENSSL_init_crypto
  12. linux系统——hadoop环境搭建
  13. VTK:线宽用法实战
  14. 一文带你看透IP归属地
  15. 计算机网络——数字信号(五)
  16. 鸿蒙系统王维,王维这句诗有多美?先被欧阳修“偷”了,后被苏轼“偷”了
  17. 基于openssl的3DES(ECB)加密算法
  18. SSL单向、双向认证
  19. wpa_supplicant wpa_cli 无线网络配置
  20. 队列和堆栈 --- 先进先出和先进后出

热门文章

  1. 利用元数据管理数据质量
  2. 暴力/图论 hihoCoder 1179 永恒游戏
  3. js获取单选框里面的值
  4. GDAL/OGR 1.9.0获取shp文件中中文字段值和属性值乱码文件解决
  5. 五个提升人生智慧的经典故事
  6. SpringBoot如何直接访问HTML页面
  7. CSDN2019博客之星评选——期待各位大佬的投票!
  8. 记录一次java.lang.ClassCastException的java类型转换异常解决方案-附最终解决方案
  9. Spring Cloud Eureka 属性配置中文说明文档
  10. linux添加硬盘永久挂载,linux新增硬盘如何挂载