安全矩阵

 找回密码
 立即注册
搜索
查看: 1895|回复: 0

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

[复制链接]

30

主题

60

帖子

447

积分

中级会员

Rank: 3Rank: 3

积分
447
发表于 2021-4-21 20:28:54 | 显示全部楼层 |阅读模式
重量级!Maven史上最全教程,看了必懂
CSDN 2020-10-28

作者 | 小明菜市场

来源 | 小明菜市场(ID:fileGeek)
头图 |  CSDN 下载自东方IC


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

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

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

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


maven生命周期
maven把项目构建划分为不同的生命周期,它这个过程包括编译,测试,打包,集成测试,验证,部署,maven的所有执行动作都需要指明自己在这个过程的执行位置,然后在maven执行的时候,依照过程的发展依次调用包进行处理。这个是maven的一个基本的调度机制,
1、maven的标准工程结构
  1. |-- pom.xml(maven的核心配置文件)
  2. |-- src
  3. |-- main
  4.   |-- java(java源代码目录)
  5.   |-- resources(资源文件目录)
  6. |-- test
  7.     |-- java(单元测试代码目录)
  8. |-- target(输出目录,所有的输出物都存放在这个目录下)
  9.     |-- 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版本规范一般定义为
  1. <major version>、<minor version>、<incremental version>-<qualifier>
复制代码
处理逻辑的版本号为
  1. SNAPSHOT - 这个版本一般用于开发过程中,表示不稳定的版本。
  2. LATEST - 指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个 snapshot 版,具体看哪个时间最后。
  3. 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 文件中引入对应的标签即可。
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  3.   <modelVersion>4.0.0</modelVersion>
  4.   <groupId>com.zp.maven</groupId>
  5.   <artifactId>MavenDemo</artifactId>
  6.   <version>0.0.1-SNAPSHOT</version>
  7.   <packaging>jar</packaging>
  8.   <name>MavenDemo</name>
  9.   <url>http://maven.apache.org</url>

  10.   <properties>
  11.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12.     <junit.version>3.8.1</junit.version>
  13.   </properties>

  14.   <dependencies>
  15.     <dependency>
  16.       <groupId>junit</groupId>
  17.       <artifactId>junit</artifactId>
  18.       <version>${junit.version}</version>
  19.       <scope>test</scope>
  20.     </dependency>

  21.     <dependency>
  22.       <groupId>log4j</groupId>
  23.       <artifactId>log4j</artifactId>
  24.       <version>1.2.12</version>
  25.       <scope>compile</scope>
  26.     </dependency>
  27.   </dependencies>
  28. </project>
复制代码
标签具有四个属性。
  1. <groupId> - 项目组织唯一的标识符,实际对应 JAVA 的包的结构。
  2. <artifactId> - 项目唯一的标识符,实际对应项目的名称,就是项目根目录的名称。
  3. <version> - jar 包的版本号。可以直接填版本数字,也可以在 properties 标签中设置属性值。
  4. <scope> - jar 包的作用范围。可以填写 compile、runtime、test、system 和 provided。用来在编译、测试等场景下选择对应的 classpath。
复制代码

如何寻找 jar 包
在  mvnrepository.com 站点搜寻你想要的 jar 包版本使用 maven 插件要添加 Maven 插件,可以在 pom.xml 文件中添加标签。
  1. <build>
  2.   <plugins>
  3.     <plugin>
  4.       <groupId>org.apache.maven.plugins</groupId>
  5.       <artifactId>maven-compiler-plugin</artifactId>
  6.       <version>3.3</version>
  7.       <configuration>
  8.         <source>1.7</source>
  9.         <target>1.7</target>
  10.       </configuration>
  11.     </plugin>
  12.   </plugins>
  13. </build>
复制代码

一次编译多个工程需要创建一个父 maven 工程,它有两个字工程,my-app,my-webapp
  1. +- pom.xml
  2. +- my-app
  3. | +- pom.xml
  4. | +- src
  5. |   +- main
  6. |     +- java
  7. +- my-webapp
  8. | +- pom.xml
  9. | +- src
  10. |   +- main
  11. |     +- webapp
复制代码
app 工程的pom.xml 如下,重点在于 modules 中引入了两个子 module
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4.                       http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.   <modelVersion>4.0.0</modelVersion>

  6.   <groupId>com.mycompany.app</groupId>
  7.   <artifactId>app</artifactId>
  8.   <version>1.0-SNAPSHOT</version>
  9.   <packaging>pom</packaging>

  10.   <modules>
  11.     <module>my-app</module>
  12.     <module>my-webapp</module>
  13.   </modules>
  14. </project>
复制代码
选择编译 某某 时,会依次对它所有的 module 执行相同的操作。

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

可以使用 Spring-boot-maven-plugin 插件
  1. <build>
  2.   <plugins>
  3.     <plugin>
  4.       <groupId>org.springframework.boot</groupId>
  5.       <artifactId>spring-boot-maven-plugin</artifactId>
  6.       <executions>
  7.         <execution>
  8.           <goals>
  9.             <goal>repackage</goal>
  10.           </goals>
  11.         </execution>
  12.       </executions>
  13.     </plugin>
  14.   </plugins>
  15. </build>
复制代码
如果引入了第三方jar包,如何打包首先,添加依赖
  1. <dependency>
  2.   <groupId>io.github.dunwu</groupId>
  3.   <artifactId>dunwu-common</artifactId>
  4.   <version>1.0.0</version>
  5.   <scope>system</scope>
  6.   <systemPath>${project.basedir}/src/main/resources/lib/dunwu-common-1.0.0.jar</systemPath>
  7. </dependency>
复制代码
然后配置插件
  1. <build>
  2.   <plugins>
  3.     <plugin>
  4.       <groupId>org.springframework.boot</groupId>
  5.       <artifactId>spring-boot-maven-plugin</artifactId>
  6.       <executions>
  7.         <execution>
  8.           <goals>
  9.             <goal>repackage</goal>
  10.           </goals>
  11.         </execution>
  12.       </executions>
  13.       <configuration>
  14.         <includeSystemScope>true</includeSystemScope>
  15.       </configuration>
  16.     </plugin>
  17.   </plugins>
  18. </build>
复制代码
最佳实践
通过 bom 统一管理版本使用类似 spring-boot-dependencies的方式统一管理依赖版本spring-boot-dependencies的pom.xml的形式
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-dependencies</artifactId>
  6. <version>2.1.4.RELEASE</version>
  7. <packaging>pom</packaging>

  8. <!-- 省略 -->

  9. <!-- 依赖包版本管理 -->
  10. <dependencyManagement>
  11.     <dependencies>
  12.     <!-- 省略 -->
  13.     </dependencies>
  14. </dependencyManagement>

  15. <build>
  16. <!-- 插件版本管理 -->
  17. <pluginManagement>
  18.     <plugins>
  19.     <!-- 省略 -->
  20.     </plugins>
  21. </pluginManagement>
  22. </build>
  23. </project>
复制代码
其他项目中,通过引入来管理依赖
  1. <dependencyManagement>
  2.     <dependencies>
  3.         <dependency>
  4.             <groupId>org.springframework.boot</groupId>
  5.             <artifactId>spring-boot-dependencies</artifactId>
  6.             <version>${spring-boot.version}</version>
  7.             <type>pom</type>
  8.             <scope>import</scope>
  9.         </dependency>
  10.     </dependencies>
  11. </dependencyManagement>
复制代码








回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-21 05:41 , Processed in 0.012677 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表