把 Maven 提交到项目?Maven Wrapper的使用与好处
本文收录于 Github.com/niumoo/JavaNotes,Java 系列文档,数据结构与算法!
本文收录于网站:https://www.wdbyte.com/,我的公众号:程序猿阿朗
前言
不知道你有没有发现,如果使用 https://start.spring.io/ 或者使用 IDEA 创建一个 Spring Boot 项目,生成的文件列表中或有 mvnw 和 mvnw.cmd 两个命令文件。如果细心的同学查看隐藏目录,还会发现一个 .mvn 文件夹,那么这几个文件是干嘛的呢?这篇文章介绍它的相关知识。
├── .gitignore
├── .mvn -> 关注
│ └── wrapper
│ ├── maven-wrapper.jar -> 关注
│ └── maven-wrapper.properties -> 关注
├── HELP.md
├── mvnw -> linux 命令文件
├── mvnw.cmd -> windows 命令文件
├── pom.xml
└── src
├── main
│ ├── java/com/wdbyte/com/springbootdemo/SpringbootdemoApplication.java
│ └── resources
│ ├── application.properties
│ ├── static
│ └── templates
└── test/java/com/wdbyte/com/springbootdemo/SpringbootdemoApplicationTests.java
Maven Wrapper 是什么
上面提到的 mvnw 命令,它的全称是 Maven Wrapper,这是 Maven 提供的一个非常有用的工具,它会自动下载指定版本的 Maven 用于项目构建,而且开发者自由配置 Maven 版本,以此提供一致的构建体验。
mvnw 的命令使用体验和 mvn 完全一致,只需要把 mvn 命令换成 mvnw ,你可以在有 mvnw 文件的 Spring Boot 项目中进行测试。
$ ./mvnw --version
Apache Maven 3.9.5 (57804ffe001d7215b5e7bcb531cf83df38f93546)
Maven home: /Users/darcy/.m2/wrapper/dists/apache-maven-3.9.5-bin/32db9c34/apache-maven-3.9.5
Java version: 21, vendor: Oracle Corporation, runtime: /Users/darcy/develop/jdk-21.jdk/Contents/Home
Default locale: zh_CN_#Hans, platform encoding: UTF-8
OS name: "mac os x", version: "14.0", arch: "x86_64", family: "mac"
注:windows 环境请使用
mvnw.cmd
Maven Wrapper 官网:https://maven.apache.org/wrapper/
Maven Wrapper 使用场景
设想一下,如果所在的团队同时维护多个项目,不同的项目使用的 JDK 版本不相同,使用的 Maven 版本也不相同,那么为了支持多项目开发,为了构建运行效果一致,你可能需要在本地管理多个 Maven 版本,这会非常繁琐,而 Maven Wrapper 可以轻松的解决这个问题。
Maven Wrapper 的引入解决了下面几个问题:
- 版本一致性:通过在
mvnw配置中指定 Maven 版本,确保所有开发人员和持续集成环境使用相同的 Maven 版本。 - 简化设置:新团队成员或 CI 环境不需要预先安装 Maven,直接运行
mvnw命令就如安装了mvn一样,从而简化了项目的初始设置和配置。 - 跨平台:Wrapper 是跨平台的,无论是在 Windows 还是在 Unix-like 系统上,都可以以相同的方式执行。
使用 Maven Wrapper 的好处简单的说,可以是 “如果想要使用不同的 Maven 版本进行项目构建,只需在项目中存放一个脚本文件,而不是在本地安装不同的 Maven 版本”。
Maven Wrapper 使用方式
自动生成
如果本地机器已经安装了 Maven ,那么可以在指定项目中通过命令生成 mvnw 命令。
要在现有项目中引入 Maven Wrapper,需要执行如下命令:
mvn -N wrapper:wrapper
也可以指定 maven 版本。
mvn -N wrapper:wrapper -Dmaven=3.9.5
选项 -N 参数表示非递归,因此 Maven Wrapper 只会在项目的当前目录生成,如果项目中有子模块,那么则不会作用到子模块中。
下面我在一个空的 Spring Boot 项目中进行测试。
一个没有 mvnw 的 Spring Boot 项目:
$ ls -l -a
total 16
-rw-r--r--@ 1 darcy staff 395 4 16 21:44 .gitignore
-rw-r--r--@ 1 darcy staff 1249 4 16 21:44 pom.xml
drwxr-xr-x@ 4 darcy staff 128 4 16 21:44 src
drwxr-xr-x 11 darcy staff 352 4 16 21:50 target
使用 mvn -N wrapper:wrapper 生成 mvnw。
$ mvn wrapper:wrapper
[INFO] Scanning for projects...
... 省略日志
[INFO] -------------------< com.wdbyte.com:springbootdemo >--------------------
[INFO] Building springbootdemo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-wrapper-plugin:3.2.0:wrapper (default-cli) @ springbootdemo ---
....省略日志
[INFO] Unpacked bin type wrapper distribution org.apache.maven.wrapper:maven-wrapper-distribution:zip:bin:3.2.0
[INFO] Configuring .mvn/wrapper/maven-wrapper.properties to use Maven 3.6.3 and download from http://mvnrepo.alibaba-inc.com/mvn/repository
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20.518 s
[INFO] Finished at: 2024-04-16T22:36:16+08:00
[INFO] ------------------------------------------------------------------------
查看目录已经生成。
$ ls -l -a
-rw-r--r--@ 1 darcy staff 395 4 16 21:44 .gitignore
drwxr-xr-x 3 darcy staff 96 3 8 2023 .mvn
-rwxr-xr-x 1 darcy staff 11289 3 8 2023 mvnw
-rw-r--r-- 1 darcy staff 7796 3 8 2023 mvnw.cmd
-rw-r--r--@ 1 darcy staff 1249 4 16 21:44 pom.xml
drwxr-xr-x@ 4 darcy staff 128 4 16 21:44 src
drwxr-xr-x 11 darcy staff 352 4 16 21:50 target
# 查看版本
$ ./mvnw --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/darcy/.m2/wrapper/dists/apache-maven-3.6.3-bin/c7849ca4/apache-maven-3.6.3
Java version: 21, vendor: Oracle Corporation, runtime: /Users/darcy/develop/jdk-21.jdk/Contents/Home
Default locale: zh_CN_#Hans, platform encoding: UTF-8
OS name: "mac os x", version: "14.0", arch: "x86_64", family: "mac"
生成的文件说明:
mvnw和mvnw.cmd脚本,分别用于 Unix/Linux 和 Windows 环境。.mvn/wrapper/mavenwrapper.jar是 Maven Wrapper 运行时所需的 Jar 文件。.mvn/wrapper/maven-wrapper.properties是配置文件,可以配置 Maven 版本。
然后就可以使用 mvnw 代替 mvn 构建或运行项目了。
./mvnw spring-boot:run
手动复制
通过将上面生成的文件和文件夹复制到一个新项目中,就可以拷贝一份 Maven Wrapper 。
需要拷贝的文件如下:
./
├── .mvn
│ └── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
手动配置
直接修改 maven-wrapper.properties 中的内容可以修改 Maven 版本,如修改 Maven 版本为 3.9.5,只需要修改 distributionUrl 的值为指定版本的下载地址。
$ cat .mvn/wrapper/maven-wrapper.properties
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
Maven Wrapper 总结
Maven Wrapper 是一个非常好用的工具,虽然它不是项目的一部分,但是如果把它放到项目中,不仅简化了项目的构建环境配置过程,还为项目构建减少了潜在的问题。如果你还没有在你的项目中使用 Maven Wrapper,不妨考虑尝试一下。将 Maven Wrapper 集成到项目中是一个不错的方式,这样可以跟随项目源码一起管理,可以让所有使用该项目的同学都能得到相同的构建结果。
集成步骤通常如下:
- 在项目根目录执行前面提到的命令添加 Maven Wrapper。
- 提交生成的
mvnw,mvnw.cmd和.mvn/目录到版本控制系统。 - 更新项目文档,指导团队成员使用
./mvnw替代mvn。
参考
本文收录于 Github.com/niumoo/JavaNotes,Java 系列文档,数据结构与算法!
本文收录于网站:https://www.wdbyte.com/,我的公众号:程序猿阿朗
把 Maven 提交到项目?Maven Wrapper的使用与好处的更多相关文章
- 08.基于IDEA+Spring+Maven搭建测试项目--Maven的配置文件settings.xml
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...
- maven 一个简单项目 —— maven权威指南学习笔记(三)
目标: 对构建生命周期 (build lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...
- eclipse导入SVN上的Maven多模块项目
eclipse导入SVN上的Maven多模块项目 博客分类: Eclipse&MyEclipse SVN Maven 一.SVN上Maven多模块项目结构 使用eclipse导入SVN上的 ...
- Maven学习- 使用Maven构建Web项目
从网上查了一些资料,才算明白(也就是怎么操作吧),怎么使用Maven构建一个Web项目,找到一篇文档,主要都是从这里学到的: 下载地址:使用Eclipse构建Maven的Web项目.docx 现自己在 ...
- Java-Maven-Runoob:Maven 构建 Java 项目
ylbtech-Java-Maven-Runoob:Maven 构建 Java 项目 1.返回顶部 1. Maven 构建 Java 项目 Maven 使用原型 archetype 插件创建项目.要创 ...
- maven多模块项目,多web合并项目使用心得
Fixflow,做中国最好的开源流程引擎!项目地址https://github.com/fixteam/fixflow 此文章适合maven初学者或想接触maven的用户,讲的只是皮毛,高手请自觉略过 ...
- 使用Maven构建Android项目
http://www.ikoding.com/build-android-project-with-maven/ 之前一直在做WEB前端项目,前段时间接手第一个Android项目,拿到代码之后,先试着 ...
- Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建(转)
这篇文章主要讲解使用eclipse对Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建过程,包括里面步骤和里面的配置文件如何配置等等都会详细说明. 如果还没有搭建好环境( ...
- SVN基于Maven的Web项目更新,本地过程详细解释
周围环境 MyEclipse:10.7 Maven:3.1.1 概要 最近在做项目,MyEclipse下载SVN基于上述Maven的Web问题,有时候搞了非常半天,Maven项目还是出现叉号,最后总结 ...
- IDEA下使用maven构建web项目(SpringMVC+Mybatis整合)
需求背景:由于最近总是接到一些需求,需要配合前端团队快速建设移动端UI应用或web应用及后台业务逻辑支撑的需求,若每次都复用之前复杂业务应用的项目代码,总会携带很多暂时不会用到的功能或组件,这样的初始 ...
随机推荐
- Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架)
Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架) 大语言模型 (Large Language Models, LLMs) 在不同领域都表现出了优异的性能.然而, ...
- Linux管理SpringBoot应用shell脚本实现
Liunx系统如何部署和管理SpringBoot项目应用呢?最简单的方法就是写个shell脚本. Spring Boot是Java的一个流行框架,用于开发企业级应用程序.下面我们将学习如何在Lin ...
- 遥感图像镶嵌拼接:ENVI的Pixel Based Mosaicking工具操作方法
本文介绍基于ENVI软件,利用"Pixel Based Mosaicking"工具实现栅格遥感影像镶嵌拼接的方法. 首先需要说明的是,本文需要镶嵌的遥感影像并不含地理参考信 ...
- WAF和IPS的区别
简介 Web应用防火墙WAF(Web Application Firewall)和入侵防御系统IPS(Intrusion Prevention System)是网络安全领域中常见的两种安全解决方案,它 ...
- mybatis-plus详细使用教程
mybatis-plus使用教程 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/jszw/mybatis-plus 什么是Mybati ...
- Qt HTTP网络相关GET,POST(HTTP 模拟POST 表单(multipartform)最简单和正式的方法)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- npm ERR! code 1 npm ERR! path E:\20231213\vue-element-admin\node_modules\node-sass npm ERR! command failed npm ERR! command C:\WINDOWS\system32\cmd.exe /d /s /c node scripts/build.js
执行npm install报错,根据下面报错信息可知,是由于nodejs和node-sass版本不一致造成的,也就是当前项目比较旧,而我安装的nodejs比较新. PS E:\20231213\vue ...
- STL:vector中如何使用at()来避免程序报错
#include <iostream> #include <vector> using namespace std; int main() { vector<int> ...
- 记录--极致舒适的Vue页面保活方案
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 为了让页面保活更加稳定,你们是怎么做的? 我用一行配置实现了 Vue页面保活是指在用户离开当前页面后,可以在返回时恢复上一次浏览页面的状态 ...
- 快速上手系列:webservice
不同公司的系统交互,用webservice可以起到安全的作用. Webservice使用方法如下: 客户端: 这个是要打成jar包,给别人的用的,里面只是接口,没有实现. 用Webservic ...