Springboot 打包神器Maven 保姆级教程
一、介绍
Maven 是基于项目对象模型 (POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具,简单的说就是用来管理项目所需要的依赖且管理项目构建的工具。
二、maven 作用
Maven 官网:https://maven.apache.org
Maven 仓库:https://search.maven.org/search
- 在开发中,为了保证编译通过,我们会到处去寻找 jar 包,当编译通过了,运行的时候,却发现 “ClassNotFoundException”,我们想到的是,难道还差 jar 包?
- 每个 Java 项目的目录结构都没有一个统一的标准,配置文件到处都是,单元测试代码到底应该放在那里也没有一个权威的规范。
- 因此,我们就要用到 Maven(使用 Ant 也可以,不过编写 Ant 的 xml 脚本比较麻烦)---- 一个项目管理工具。
- Maven 主要做了两件事:
- 统一开发规范与工具
- 统一管理 jar 包
三、maven 的生命周期
maven 把项目的构建划分为不同的生命周期(lifecycle)。包括:
- 验证(validate):验证项目是否正确
- 编译(compile):编译项目的源代码
- 测试(test):使用合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署
- 打包(package):项目打包成 war 包或 jar 包
- 验证(verify)
- 安装(install):打包后的 jar 包,安装要本地的 repository 中。
- 部署(deploy)
maven 中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后 maven 执行的时候,就依照过程的发展一次调用这些 goal 进行各种处理。
这个也是 maven 的一个基本调度机制。一般来说,位置稍后的过程都会依赖于之前的过程。当然,maven 同样提供了配置文件,可以依照用户要求,跳过某些阶段。
三、maven 规范
maven 使用如下几个要素来唯一定位某一个输出物:
groupId;artifactId;packaging;version。
- groupId 公司、团体等。比如 Apache Software 的项目有以下 org。apache 开头的 groupId。
- artifactId 项目是唯一标识符。比如一个 helloworld 项目就叫 helloworld。
- packaging 项目打包输出的类型,默认是 jar 包,也可以为 war 包,产生一个 web 应用。
- version 一个项目的特定的版本。发布的项目有一个固定的版本表示来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识个版本加上一个 “SNAPSHOT” 的标记。
maven在版本管理时候可以使用几个特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。比如"1.0-SNAPSHOT"。各个部分的含义和处理逻辑如下说明:
1. SNAPSHOT 如果一个版本包含字符串"SNAPSHOT",Maven就会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转换为UTC时间。例如,"1.0-SNAPSHOT"会在2010年5月5日下午2点10分发布时候变成1.0-20100505-141000-1。这个词只能用于开发过程中,因为一般来说,项目组都会频繁发布一些版本,最后实际发布的时候,会在这些snapshot版本中寻找一个稳定的,用于正式发布,比如1.4版本发布之前,就会有一系列的1.4-SNAPSHOT,而实际发布的1.4,也是从中拿出来的一个稳定版。
2. LATEST 指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个snapshot版,具体看哪个时间最后。
3. RELEASE 指最后一个发布版
四、maven 项目依赖
1. 多模块依赖和继承
项目结构图:
parent├─childA(model层)│ └─pom.xml(jar)├─childB(web层)│ └─pom.xml(war)└─pom.xml(pom)
- parent 中执行 mvn install 就能将 childA 和 childB 一起编译
parent 的 pom.xml 做如下配置:
<groupId>com.ht</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging> <!-- pom表示它是一个被继承的模块 --><modules><module>childA</module> <!-- 不加module则不会被联合编译 --><module>childB</module>
</modules>
childA 和 childB 的 pom.xml 都需要配置 parent,防止引入的包冲突 (如果不加 parent,会分别去编译他们引入的依赖,会重复引入包):
<!-- childA 的 pom.xml-->
<parent><artifactId>parent</artifactId><groupId>com.ht</groupId><version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>childA</artifactId>
<packaging>jar</packaging><!-- childB 的 pom.xml-->
<parent><artifactId>parent</artifactId><groupId>com.ht</groupId><version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>childB</artifactId>
<packaging>war</packaging>
- 子 pom 间存在引用关系,比如 childB 引用到了 childA 的 jar 包
<dependency><groupId>com.module</groupId><artifactId>childA</artifactId> <!--加上childA的依赖--><version>1.0-SNAPSHOT</version>
</dependency>
2. 子项目继承父项目的依赖
parent 中加上 dependencyManagement,child 项目就可以继承 parent 项目的依赖,并且在 child 中可以不用加 version 了。
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
子项目直接引入 parent的依赖 就行
3. 依赖范围
dependency 依赖关系中 Scope(范围)的作用:主要管理依赖的部署。
如果不显示执行 <scope>
删除线格式 属性时,默认 <scope>compile</scope>
。
scope 属性包括(5 个值):
- compile(编译范围):编译范围的在所有的classpath中可用,同时它们也会被打包
- provided(已提供范围):表示部署的环境当中有某容器已经提供了该jar包,只在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的Servlet API来编译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API;这个Servlet API JAR由你的servlet容器(Tomcat)提供。
- runtime(运行时范围):只在运行和测试系统的时候需要,但在编译的时候不需要。
- test(测试范围):在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
- system (系统范围):该范围不推荐使用(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)
详细可参考:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope
4. 可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)
maven 的依赖关系是有传递性的。如:A–>B,B–>C。但有时候,项目 A 可能不是必需依赖 C,因此需要在项目 A 中排除对 A 的依赖。在 maven 的依赖管理中,有两种方式可以对依赖关系进行,分别是可选依赖(Optional Dependencies)以及依赖排除(Dependency Exclusions)。
4.1 可选依赖 optional
当一个项目 A 依赖另一个项目 B 时,项目 A 可能很少一部分功能用到了项目 B,此时就可以在 A 中配置对 B 的可选依赖。举例来说,一个类似 hibernate 的项目,它支持对 mysql、oracle 等各种数据库的支持,但是在引用这个项目时,我们可能只用到其对 mysql 的支持,此时就可以在这个项目中配置可选依赖。
配置可选依赖的原因:1、节约磁盘、内存等空间;2、避免license许可问题;3、避免类路径问题,等等
。
<dependency><groupId>sample.ProjectB</groupId><artifactId>Project-B</artifactId><version>1.0</version><scope>compile</scope><optional>true</optional>
</dependency>
假设以上配置是项目 A 的配置,即:Project-A --> Project-B。在编译项目 A 时,是可以正常通过的。
如果有一个新的项目 X 依赖 A,即:Project-X -> Project-A。此时项目 X 就不会依赖项目 B 了。如果项目 X 用到了涉及项目 B 的功能,那么就需要在 pom.xml 中重新配置对项目 B 的依赖。
4.2 依赖排除 (exclusions)
当一个项目 A 依赖项目 B,而项目 B 同时依赖项目 C,如果项目 A 中因为各种原因不想引用项目 C,在配置项目 B 的依赖时,可以排除对 C 的依赖。
示例(假设配置的是 A 的 pom.xml,依赖关系为:A --> B; B --> C):
<dependency><groupId>sample.ProjectB</groupId><artifactId>Project-B</artifactId><version>1.0</version><scope>compile</scope><exclusions><exclusion><groupId>sample.ProjectC</groupId><artifactId>Project-C</artifactId></exclusion></exclusions>
</dependency>
当然,对于多重依赖,配置也很简单,参考如下示例:
项目 A–> 项目 B --> 项目 C --> 项目 D --> 项目 E
<dependency><groupId>sample.ProjectB</groupId><artifactId>Project-B</artifactId><version>1.0-SNAPSHOT</version><exclusions><exclusion><groupId>sample.ProjectE</groupId><artifactId>Project-E</artifactId></exclusion></exclusions>
</dependency>
5. dependency 中的 type 属性
dependency 中 type 默认为 jar 即引入一个特定的 jar 包。那么为什么还会有 type 为 pom 呢?
当我们需要引入很多 jar 包的时候会导致 pom.xml 过大,我们可以想到的一种解决方案是定义一个父项目,但是父项目只有一个,也有可能导致父项目的 pom.xml 文件过大。这个时候我们引进来一个 type 为 pom,意味着我们可以将所有的 jar 包打包成一个 pom,然后我们依赖了 pom,即可以下载下来所有依赖的 jar 包
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope>
</dependency>
6.properties 标签
用户可以使用该类属性引用 POM 文件中对应元素的值。如 ${project.artifactId} 就对应了<project>
<artifactId>
元素的值,常用的 POM 属性包括:
${project.build.sourceDirectory}: 项目的主源码目录,默认为 src/main/java/
${project.build.testSourceDirectory}: 项目的测试源码目录,默认为 src/test/java/
${project.build.directory} : 项目构建输出目录,默认为 target/
${project.outputDirectory} : 项目主代码编译输出目录,默认为 target/classes/
${project.testOutputDirectory}:项目测试主代码输出目录,默认为 target/testclasses/
${project.groupId}:项目的 groupId
${project.artifactId}:项目的 artifactId
${project.version} : 项 目 的 v e r s i o n , 与 {project.version}:项目的 version, 与 project.version:项目的 version, 与 {version} 等价
p r o j e c t . b u i l d . f i n a l N a m e :项目打包输出文件的名称,默认为 {project.build.finalName} : 项目打包输出文件的名称,默认为 project.build.finalName:项目打包输出文件的名称,默认为{project.artifactId}-${project.version}
例子:
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.version>2.1.6_RELEASE</spring.version><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.source>1.8</maven.compiler.source><developer.organization><![CDATA[xy公司]]></developer.organization>
</properties>
五、Maven 插件机制
1. Maven 默认插件
不配置 Plugin 时,Maven 默认会使用以下插件。如果针对各个 plugin 有特殊配置的话,需要显示指定 plugin 和 属性配置。
其中的 build 标签描述了如何来编译及打包项目,而具体的编译和打包工作是通过 build 中配置的 plugin 来完成。当然 plugin 配置不是必须的,默认情况下,Maven 会绑定以下几个插件来完成基本操作。
plugin | function | life cycle phase |
---|---|---|
maven-clean-plugin | 清理上一次执行创建的 target 文件 | clean |
maven-resources-plugin | 处理资源文件 | resources,testResources |
maven-compiler-plugin | 编译 Java 代码 | compile、testCompile |
maven-surefire-plugin | 执行单元测试文件 | test |
maven-jar-plugin | 创建 jar | package |
maven-install-plugin | 清理上一次执行创建的 target 文件拷贝 jar 到本地的 maven 仓库 /repository 下面清理上一次执行创建的 target 文件 | install |
maven-deploy-plugin | 发布 ja | deploy |
maven-site-plugin | 生成文档 | site |
maven-site-plugin:将工程所有文档生成网站,生成的网站界面默认和apache的项目站点类似,但是其文档用doxia格式写的,目前不支持docbook,需要用其他插件配合才能支持。需要指出的是,在maven 2.x系列中和maven3.x的site命令处理是不同的,在旧版本中,用 mvn site 命令可以生成reporting节点中的所有报表,但是在maven3中,reporting过时了,要把这些内容作为 maven-site-plugin的configuration的内容才行。
<build><!-- resources 是 maven-resources-plugin 的--><resources><resource><directory>src/main/java</directory><filtering>true</filtering> <!-- filtering 用来表示资源文件中的占位符是否需要被profiles中的属性动态替换,true为需要替换。 --><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/*.properties</include><include>*.xml</include><include>*.dic</include><include>*.txt</include></includes></resource><resource><directory>src/main/resources</directory><filtering>false</filtering><includes><include>*.p12</include></includes></resource></resources><plugins><!-- maven-compiler-plugin编译源代码。指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 windows默认使用GBK编码,java项目经常编码为utf8,也需要在compiler插件中指出,否则中文乱码可能会出现编译错--><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!--maven-resources-plugin用来处理资源文件,默认的主资源文件目录是src/main/resources。--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.6</version><configuration><encoding>UTF-8</encoding></configuration></plugin></plugins>
</build>
2.maven 常用的插件
spring-boot-maven-plugin
当使用 SpringBoot 开发项目的时候,会使用到 spring-boot-maven-plugin 插件
Spring Boot Maven plugin 有 5 个 Goals:
命令 | 说明 |
---|---|
spring-boot:repackage | 默认 goal。在 mvn package 之后,再次打包可执行的 jar/war, 并将 mvn package 生成的软件包重命名为 *.original |
spring-boot:run | 运行 Spring Boot 应用 |
spring-boot:start | 在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理 |
spring-boot:stop | 在 mvn integration-test 阶段,进行 Spring Boot 应用生命周期的管理 |
spring-boot:build-info | 生成 Actuator 使用的构建信息文件 build-info.properties |
其中比较重要的命令是:
mvn package spring-boot:repackage
执行后会看到生成的两个 jar 文件,一个是 *.jar,另一个是 *.jar.original。
这是由于在执行上述命令的过程中,Maven 首先在 package 阶段打包生成 *.jar 文件;然后执行 spring-boot:repackage 重新打包
2.1 maven-source-plugin
maven-source-plugin 提供项目自动将源码打包并发布的功能,在需要发布源码项目的 pom.xml 文件中添加如下代码即可:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><configuration></configuration><executions><execution><id>attach-sources</id><goals><goal>jar</goal></goals></execution></executions>
</plugin>
执行 mvn install
,maven 会自动将 source install 到 repository 。
执行 mvn deploy
,maven 会自动将 source deploy 到 remote-repository 。
执行 mvn source:jar
,单独打包源码。
注意:在多项目构建中,将 source-plugin 置于顶层或 parent 的 pom 中并不会发挥作用,必须置于具体项目的 pom 中。
六、mvn 命令行参数
参数可选列表
mvn -v, –version 显示版本信息;
mvn -V, –show-version 显示版本信息后继续执行Maven其他目标;
mvn -h, –help 显示帮助信息; mvn -e, –errors 控制Maven的日志级别,产生执行错误相关消息;
mvn -X, –debug 控制Maven的日志级别,产生执行调试信息;
mvn -q, –quiet 控制Maven的日志级别,仅仅显示错误;
mvn -Pxxx 激活 id 为 xxx的profile (如有多个,用逗号隔开);
mvn -Dxxx=yyy 指定Java全局属性;
mvn -o , –offline 运行offline模式,不联网更新依赖;
mvn -N, –non-recursive 仅在当前项目模块执行命令,不构建子模块;
mvn -pl, –module_name 在指定模块上执行命令;
mvn -ff, –fail-fast 遇到构建失败就直接退出;
mvn -fn, –fail-never 无论项目结果如何,构建从不失败;
mvn -fae, –fail-at-end 仅影响构建结果,允许不受影响的构建继续;
mvn -C, –strict-checksums 如果校验码不匹配的话,构建失败;
mvn -c, –lax-checksums 如果校验码不匹配的话,产生告警;
mvn -U 强制更新snapshot类型的插件或依赖库(否则maven一天只会更新一次snapshot依赖);
mvn -npu, –no-plugin-updates 对任何相关的注册插件,不进行最新检查(使用该选项使Maven表现出稳定行为,该稳定行为基于本地仓库当前可用的所有插件版本);
mvn -cpu, –check-plugin-updates 对任何相关的注册插件,强制进行最新检查(即使项目POM里明确规定了Maven插件版本,还是会强制更新);
mvn -up, –update-plugins [mvn -cpu]的同义词;
mvn -B, –batch-mode 在非交互(批处理)模式下运行(该模式下,当Mven需要输入时,它不会停下来接受用户的输入,而是使用合理的默认值);
mvn -f, –file 强制使用备用的POM文件; mvn -s, –settings 用户配置文件的备用路径;
mvn -gs, –global-settings 全局配置文件的备用路径;
mvn -emp, –encrypt-master-password 加密主安全密码,存储到Maven settings文件里;
mvn -ep, –encrypt-password 加密服务器密码,存储到Maven settings文件里;
mvn -npr, –no-plugin-registry 对插件版本不使用~/.m2/plugin-registry.xml(插件注册表)里的配置
-D代表(Properties属性)
用法:
mvn -DpropertyName=propertyValue clean package
如果pom.xml中不存在名为propertyName属性,它将被设置
如果pom.xml中已存在propertyName属性,其(propertyValue)值将会传递给参数
要发送多个变量,请使用多个空格分隔符加-D:
mvn -DpropA=valueA -DpropB=valueB -DpropC=valueC clean package
举例:
pom.xml
<properties><theme>myDefaultTheme</theme>
</properties>
执行以下命令:
mvn -Dtheme=halloween clean package
打包后的pom.xml文件内容已被指定的参数替换:
<properties><theme>halloween</theme>
</properties>
-P代表(Profiles配置文件,指定环境)
<profiles>指定的<id>中,可以通过-P进行传递或者赋值
举例
pom.xml
如下:
<profiles><profile><id>test</id>...</profile>
</profiles>
则触发profile中的配置的命令为:mvn test -Ptest
在譬如pom.xml
如下:
<profile><id>test</id><activation><property><name>env</name><value>test</value></property></activation>...
</profile>
则触发profile中的配置的命令为:mvn test -Penv=test
Springboot 打包神器Maven 保姆级教程相关推荐
- 官方指标监控神器SpringBootAdmin保姆级教程
SpringBoot Admin 概述 Spring Boot 有一个非常好用的监控和管理的源软件,这个软件就是 Spring Boot Admin.该软件能够将 Actuator 中的信息进行界面化 ...
- 使用webpack打包TS的保姆级教程
最近在接触TS,还以为和js差不多,结果在打包的时候,就遇见了无数的坑. (While resolving: webpackts@1.0.0 npm ERR! Found: webpack@4.46. ...
- 快速上手Springboot项目(登录注册保姆级教程)
本文章对SpringBoot开发后端项目结构做了简单介绍,并示范了使用SpringBoot+MySQL实现登录的后端功能,与本博客的另一篇文章 Vue 实现登录注册功能(前后端分离完整案例) | Ma ...
- 保姆级教程——将springboot项目部署到阿里云服务器(小白包会)
保姆级教程--将springboot项目部署到阿里云服务器(小白包会) 前言: 昨天本想着看论文,结果发现找的论文和课题不一致.那干点什么好呢?那就把我的毕业设计(一个springboot项目)部署到 ...
- 下载神器IDM安装与使用(保姆级教程)
下载神器IDM安装与使用(保姆级教程) 文章目录 下载神器IDM安装与使用(保姆级教程) 前言 一.下载地址 二.IDM是什么? 三.作用与特点 四.安装步骤 总结 前言 众所周知,下载工具是大家电脑 ...
- 重磅!深度学习神器 - 高层API 最强保姆级教程公开!
很多小伙伴在后台给我留言,零基础如何入门深度学习?想要做算法工程师,自学了python基础,现在还来得及吗? 这个问题很大.很难说一篇文章几句话就能解决这个问题.今天我给大家说一下自己的一些个人经验, ...
- SpringBoot 配置 generator代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)
保姆级教程,逻辑删除及字段自动填充设置,特别要说明的是本次用的是MySQL数据库,如果使用Oracle数据库是,数据库配置需要改变,数据库表一定要大写,否则无法生成代码. 数据库表 CREATE TA ...
- 服务器部署(保姆级教程)
服务器部署(保姆级教程) 如果有帮助到你 可以麻烦您 一键三连(评论.点赞.收藏) 在来一个关注不迷路 哟 小生不才,有啥子 错误 或者 建议 可以私信或者评论区留言,我加以完善和改正 哟 祝大家远离 ...
- win系统的阿里云服务器部署IDEASpringBoot项目保姆级教程
win系统的阿里云服务器部署SpringBoot项目保姆级教程 前言 配置阿里云服务器 配置环境 环境配置中的坑 还有别的坑的话,私信我我补充......毕竟配置是最基本的,还想咋样... jar包导 ...
最新文章
- GitLab安装说明
- 如何在 Linux 中查看目录大小?
- LuoguP1948 电话线 【二分答案/图论】
- 【转】【天道酬勤】 腾讯、百度、网易游戏、华为Offer及笔经面经
- ubuntu启动php-fpm_ubuntu安装php-fpm+xdebug
- php spl自动加载类,php – SPL自动加载最佳实践
- 外网访问Vmware虚拟机中的某个服务(如http)
- 自动柜员机属于微型计算机的一种,自动柜员机属于微型计算机的一种。( )...
- U9二开之UBF配置和档案开发
- iredmail mysql 密码_CloudCare-iRedMail 运行环境镜像使用指南
- MC56F8366 DSC并口卡配置详尽步骤
- 学计算机专业开学要买笔记本电脑吗,大一开学需要买电脑吗 大学开学电脑买什么好...
- c语言数字黑洞123问题,求助:数字黑洞效率问题
- js数组操作方法 concat
- 闭关之 Vulkan 应用开发指南笔记(四):绘制、几何体片段处理、同步和回读数据
- 根据关键词采集文章(按关键词采集数据)
- 2014年中南大学上机复试
- 微软认知服务的使用 – 漫画翻译
- iPhone 和iPad的Icon大小和设置
- 美国日本如何推动中小企业信息化
热门文章
- pytorch实现 残差网络 ResNet18 CIFAR-10 分类 计算top1-ACC,top3-ACC
- Flowable 6.4.x工作流
- Android_菜单组
- BCGControlBarPro CBCGPGridCtrl单元格添加控件
- CSS3中font-face属性的用法详解
- Python接口自动化-python使用requests库发送Get请求
- mysql truncate delete 释放磁盘空间
- Idea SmartQQ 插件引起 setting界面不能弹出
- 2017年7月26日 09:23:44
- 第一篇在CSDN上面的博客^.^