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

前言

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

为什么要使用maven

在开发中经常需要依赖第三方包,包与包之间存在依赖关系,版本之间存在兼容问题,还有需要把包进行升级和降级,当项目复杂到了一定程度的时候,需要对包进行管理。
重量级 | 重量级!Maven史上最全教程,看了必懂插图
maven是当前最受欢迎的自动化综合工具,类似的还有ant,npm,nuget,composer。
重量级 | 重量级!Maven史上最全教程,看了必懂插图1
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 的安装路径
重量级 | 重量级!Maven史上最全教程,看了必懂插图2
(3)在 Path 环境变量的变量值末尾添加%MAVEN_HOME%bin

(4)在 cmd 输入 mvn –version,如果出现 maven 的版本信息,说明配置成功。
重量级 | 重量级!Maven史上最全教程,看了必懂插图3

本地仓储配置

从中央仓库下载的jar包都会统一的保存在本地仓库中,我们需要配置本地仓库的位置。
在conf目录下的setting.xml文件。
重量级 | 重量级!Maven史上最全教程,看了必懂插图4

第一个maven工程

在 Intellij 中创建 Maven 工程

(1)创建 Maven 工程

依次点击 File -> New -> Project 打开创建工程对话框,选择 Maven 工程。
重量级 | 重量级!Maven史上最全教程,看了必懂插图5
(2)输入项目信息
重量级 | 重量级!Maven史上最全教程,看了必懂插图6
(3)点击 Intellij 侧边栏中的 Maven 工具界面,有几个可以直接使用的 maven 命令,可以帮助你进行构建。
重量级 | 重量级!Maven史上最全教程,看了必懂插图7

Maven 命令构建方式

进入工程目录,输入maven命令
重量级 | 重量级!Maven史上最全教程,看了必懂插图8

使用指导

添加外部依赖 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.0
                      http://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>

关于作者

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