前言


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


为什么要使用maven


在开发中经常需要依赖第三方包,包与包之间存在依赖关系,版本之间存在兼容问题,还有需要把包进行升级和降级,当项目复杂到了一定程度的时候,需要对包进行管理。

maven 项目里没有子项目 maven引入子项目_maven

maven是当前最受欢迎的自动化综合工具,类似的还有ant,npm,nuget,composer。



maven 项目里没有子项目 maven引入子项目_maven 项目里没有子项目_02

maven提供了开发人员构建一个完整生命周期的框架,开发团队可以自动化的完成项目的基础工具建设,maven使用标准目录结构和默认构建生命周期, 因此maven是一个项目管理工具。主要做了以下几件事情

  1. 统一开发规范与工具。
  2. 统一管理jar包

maven生命周期


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

1、maven的标准工程结构

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

2、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版本规范一般定义为

、、-


处理逻辑的版本号为

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


安装

配置环境变量


(1)解压压缩包(以 apache-maven-3.3.9-bin.zip 为例) (2)添加环境变量 MAVEN_HOME,值为 apache-maven-3.3.9 的安装路径

maven 项目里没有子项目 maven引入子项目_xml_03

(3)在 Path 环境变量的变量值末尾添加%MAVEN_HOME%bin

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

maven 项目里没有子项目 maven引入子项目_maven 项目里没有子项目_04

本地仓储配置


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

maven 项目里没有子项目 maven引入子项目_xml_05


第一个maven工程

在 Intellij 中创建 Maven 工程


(1)创建 Maven 工程 依次点击 File -> New -> Project 打开创建工程对话框,选择 Maven 工程。

maven 项目里没有子项目 maven引入子项目_maven 项目里没有子项目_06

(2)输入项目信息

maven 项目里没有子项目 maven引入子项目_maven添加子工程_07

(3)点击 Intellij 侧边栏中的 Maven 工具界面,有几个可以直接使用的 maven 命令,可以帮助你进行构建。

maven 项目里没有子项目 maven引入子项目_maven_08

Maven 命令构建方式

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

maven 项目里没有子项目 maven引入子项目_maven_09


使用指导

添加外部依赖 jar 包


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

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  4.0.0  com.zp.maven  MavenDemo  0.0.1-SNAPSHOT  jar  MavenDemo  http://maven.apache.org      UTF-8    3.8.1              junit      junit      ${junit.version}      test              log4j      log4j      1.2.12      compile


标签具有四个属性。

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


如何寻找 jar 包



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

使用 maven 插件


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

org.apache.maven.plugins      maven-compiler-plugin      3.3              1.7        1.7

一次编译多个工程


需要创建一个父 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

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">  4.0.0  com.mycompany.app  app  1.0-SNAPSHOT  pom      my-app    my-webapp


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


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


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

org.springframework.boot      spring-boot-maven-plugin                                    repackage


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

io.github.dunwu  dunwu-common  1.0.0  system  ${project.basedir}/src/main/resources/lib/dunwu-common-1.0.0.jar


然后配置插件

org.springframework.boot      spring-boot-maven-plugin                                    repackage                                      true


最佳实践


通过 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.0modelVersion><groupId>org.springframework.bootgroupId><artifactId>spring-boot-dependenciesartifactId><version>2.1.4.RELEASEversion><packaging>pompackaging><dependencyManagement>    <dependencies>        dependencies>dependencyManagement><build><pluginManagement>    <plugins>        plugins>pluginManagement>build>project>


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

<dependencyManagement>    <dependencies>        <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-dependenciesartifactId>            <version>${spring-boot.version}version>            <type>pomtype>            <scope>importscope>        dependency>    dependencies>dependencyManagement>