溪云阁:专注编程教学,架构,JAVA,Python,微服务,机器学习等领域,欢迎关注,一起学习。
什么是Maven
相信现在很多公司基本上还是用Maven,相比于基于Goovy的Gradle,Maven到现在还是很多人的选择,虽然Hibernate已经于2010年迁移到Gradle,但是并不妨碍Maven的优秀。
Maven并不是一个POM文件,而是一个可以通过POM文件里面的信息描述来管理整个项目的构建、报告及文档的项目管理软件。
Maven常用命令
1、mvn install
这是最常用的命令,用于把项目安装到本地的仓库中,提供给别的项目做引用或作自有项目。
2、mvn clean
与上面的install起着反作用能力,当你发现项目install有问题的时候,可以先clean(清除),然后重新install。
3、mvn archetype
这个非常容易理解,我们一般都在eclipse或者idea创建maven项目的时候,可以用这个命令,就是创建一个maven项目。
4、mvn deploy
一般情况下,我们做maven项目,都会有私库的存在,就是自己在服务器上建自己的,存放jar包的仓库,这个命令就是用来把我们install好的包发布(其实就是网络传输)上去。
5、mvn site 生成项目相关信息的网站
我们一般在一个项目的时候,都是有一定信息的,这个命令可以帮我们生成html形式的项目信息,不过现在小编很少用。
6、mvn compile
compile编译的意思,其实就是编译maven项目的源代码
7、mvn test-compile
与上面的类似,不过这次编译的是测试测试包里面的源代码
8、mvn test
现在很多项目都要求做单元测试,这个命令可以帮助我们测试所有的单元测试。
9、mvn package
这是一个集成过程,它的执行顺序是先clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段,最后是成一个jar包
10、mvn eclipse
生成一个eclipse可直接导入的文件
11、mvnjetty:run与mvntomcat:run
启用jetty服务或者启动tomcat服务
12、mvn clean package -Dmaven.test.skip=true
这个是执行重新打包的命令,但是这个重新打包是不会执行测试类,因为有时候测试类并不能连接到一些环境。
Maven的POM文件解析
1、父项目parent解析
<parent>
groupId:父项目的组织ID,如果发布到公网,需要全球唯一-->
<artifactId />
<groupId />
<version />
<relativePath />
</parent>
#artifactId:父项目的项目id,在组织id下需要作为唯一
#version:父项目的版本号
#relativePath:父项目的系统位置,一般不设置
2、当前项目基础属性解析
<!--模型的版本,很少改变,一般定义好之后不用变化-->
<modelVersion>3.0.0</modelVersion>
<!--项目组织名称,如果继承parent,其实可以不用写-->
<groupId>com.boots</groupId>
<!--项目名称,这个要求写,打包的时候需要用到-->
<artifactId>boots-maven</artifactId>
<!--项目打包后的类型,常见的有jar,pom,war等三种-->
<packaging>war</packaging>
<!--项目当前版本,常见有RELEASE,SNAPSHOT,按照约定,尽可能要大写-->
<version>2.0.0-RELEASE</version>
<!--项目的名称,一般跟artifactId一样即可 -->
<name>boots-maven</name>
<!--项目的地址,因为在做系列,小逼设置为github地址 -->
<url>h ttps://gitee.com/smartDis/boots</url>
<!-- 项目描述,这是里为了方便后面开发的兄弟知道这是做啥的 -->
<description>Maven:12个常用命令+POM文件全属性分解,让你一清二楚</description>
<!--项目构建版本的时候产生的年月 -->
<inceptionYear />
3、前置条件属性解析(很少用)
<!--当前项目需要的前置条件 -->
<prerequisites>
<!--当前项目需要maven的最低版本-->
<maven />
</prerequisites>
4、项目问题管理issueManagement系统属性全解析
<issueManagement>
<!--当前项目问题管理系统的名称,这是为禅道 -->
<system>zentao</system>
<!--禅道的地址,这里是官网的地址,自行去搞 -->
<url>h ttps://www.zentao.net/download/80185.html</url>
</issueManagement>
5、持续继集成ciManagement全属性解析
<ciManagement>
<!--持续集成的名称,可用Walle,Jekins,云效等-->
<system />
<!--持续集成的web地址,一般有接口就填写接口 -->
<url />
<!--完成后通知 -->
<notifiers>
<notifier>
<!--通知的类型,一般为邮件 -->
<type />
<!--错误时通知 -->
<sendOnError />
<!--失败时通知 -->
<sendOnFailure />
<!--成功时通知 -->
<sendOnSuccess />
<!--警告时通知 -->
<sendOnWarning />
<!--发送地址,一般是邮件地址 -->
<address />
<!--自定义配置项 -->
<configuration />
</notifier>
</notifiers>
</ciManagement>
7、邮件列表属性mailingLists全解析
<mailingLists>
<mailingList>
<!--设置邮件名称 -->
<name>林溪</name>
<!--发送邮件地址 -->
<post>localhost127001@126.com</post>
<!--订阅邮件地址 -->
<subscribe>localhost127001@126.com</subscribe>
<!--取消订阅邮件地址 -->
<unsubscribe>localhost127001@126.com</unsubscribe>
<!--邮件服务器地址 -->
<archive>h ttps://gitee.com/smartDis/boots</archive>
</mailingList>
</mailingLists>
8、开发者列表developers及contributors属性全解析(两者属性一样,把developers换成contributors即可)
<developers>
<developer>
<!--开发者的唯一id-->
<id>林溪</id>
<!--开发者名称 -->
<name>林溪</name>
<!--开发者邮件 -->
<email>localhost127001@126.com</email>
<!--开发者主页 -->
<url >gitee.com/smartDis/boots</url>
<!--项目开发者在项目中扮演的角色,角色元素描述了各种角色 -->
<roles>
<role>Developer</role>
</roles>
<!--开发者组织 -->
<organization>boots</organization>
<!--组织的url -->
<organizationUrl>gitee.com/smartDis/boots</organizationUrl>
<!--开发者属性 -->
<properties>
<dept>No</dept>
</properties>
<!--开发者时区,一般没啥意义,只是为了让人知道这货在什么地方 -->
<timezone>8</timezone>
</developer>
</developers>
9、项目licenses属性全解析
<licenses>
<license>
<!--license名称,具有法律意义的-->
<name>boots</name>
<!--license文本的告知信息地址,这个很官方 -->
<url>gitee.com/smartDis/boots</url>
<!--代表可以用Maven中央仓库下载,一般都是这个 -->
<distribution>repo</distribution>
<!--license的其他信息 -->
<comments>我是license的其他信息</comments>
</license>
</licenses>
10、build全属性解析
<build>
<!--需要编译的源码地址 -->
<sourceDirectory />
<!--需要执行的脚本地址,一般都是拷贝到目标目录 -->
<scriptSourceDirectory />
<!--需要执行测试编译的源码地址 -->
<testSourceDirectory />
<!--编译后存放的地址 -->
<outputDirectory />
<!--测试编译后存放的地址 -->
<testOutputDirectory />
<!--拓展构建,里面的属性跟我们刚刚最上面的属性一样-->
<extensions>
<extension>
<groupId />
<artifactId />
<version />
</extension>
</extensions>
<!--全局默认值设置 -->
<defaultGoal />
<!-- 资源属性,用来操作项目中类似properties等文件-->
<resources>
<resource>
<!-- 打包后资源的目标地址。 -->
<targetPath />
<!--是否需要过滤的资源 -->
<filtering />
<!--原先存放资源的地址 -->
<directory />
<!--包含的资源的哪些文件,例如yml等 -->
<includes />
<!--不需要打包的资源的哪些文件,例如xml等-->
<excludes />
</resource>
</resources>
<!--测试包中资源的信息,属性与上面的一样,参考杰克 -->
<testResources>
<testResource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
</testResource>
</testResources>
<directory />
<!--打包后的文件名,会采用${artifactId}-${version}形式 -->
<finalName />
<!--过滤器属性文件列表 -->
<filters />
<pluginManagement>
<plugins>
<plugin>
<!--插件的group ID -->
<groupId />
<!--插件的artifact ID -->
<artifactId />
<!--插件的版本 -->
<version />
<!--插件的排除文件-->
<extensions />
<!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
</execution>
</executions>
<!--插件的依赖 -->
<dependencies>
<dependency>
</dependency>
</dependencies>
<inherited />
<configuration />
</plugin>
</plugins>
</pluginManagement>
<!--插件的列表,属性与上面类似 -->
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
</execution>
</executions>
<dependencies>
<dependency>
</dependency>
</dependencies>
<goals />
<inherited />
<configuration />
</plugin>
</plugins>
</build>
11、远程仓库repositories(一般为私库)全属性解析
<repositories>
<repository>
<releases>
<!--true -->
<enabled />
<!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
<updatePolicy />
<!--当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告)。 -->
<checksumPolicy />
</releases>
<!-- 如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的
策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 -->
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
</snapshots>
<!--远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库 -->
<id>banseon-repository-proxy</id>
<!--远程仓库名称 -->
<name>banseon-repository-proxy</name>
<!--远程仓库URL,按protocol://hostname/path形式 -->
<url>h ttp://192.168.1.169:9999/repository/</url>
<!-- 用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然
而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
<layout>default</layout>
</repository>
</repositories>
12、依赖dependencies全属性解析
<dependencies>
<dependency>
<!--依赖的组织id -->
<groupId>com.boots</groupId>
<!--依赖的artifact ID -->
<artifactId>boots-api</artifactId>
<!--依赖的版本号 -->
<version>1.1.0.RELEASE</version>
<!-- 依赖的类型,默认就是jar,一般不用配置-->
<type>jar</type>
<!-- classifier通常用于区分从同一POM构建的具有不同内容的构件(artifact -->
<classifier>jdk13</classifier>
<!--依赖范围-->
<!-- compile :默认范围,用于编译 - provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
<!-- - runtime: 在执行时需要使用 - test: 用于test任务时使用 - system: 需要外在提供相应的元素。通过systemPath来取得
- systemPath: 仅用于范围为system。提供相应的路径 - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
<scope>test</scope>
<!--仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。 -->
<systemPath></systemPath>
<!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题 -->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。 -->
<optional>true</optional>
</dependency>
</dependencies>
拓展
还有哪些没有的,欢迎补充上来
--END--
作者:@溪云阁
原创作品,抄袭必究
如需要源码,转发,关注后私信我
部分图片或代码来源网络,如侵权请联系删除,谢谢!
历史文章:
springboot2.2.X手册:Eureka不更,Consul被禁,启用Nacos
springboot2.2.X手册:构建全局唯一的短链接数据中心
springboot2.2.X手册:放弃fastdfs,整合Minio做文件服务器真香
springboot2.2.X手册:分布式系统下,重复提交的解决方案
springboot2.2.X手册:Easypoi导出excel,最新版的手感香不香?
springboot2.2.X手册:项目从100M瘦身到100K,部署省事多了!
springboot2.2.X手册:redis的7种类型100个方法全解析
springboot2.2.X手册:是时候用Lettuce替换Jedis操作Redis缓存了
springboot2.2.X手册:构建多元化的API接口,我们这样子设计
springboot2.2.X手册:基于Jasypt的JavaConfig方式敏感信息加密
springboot2.2.X手册:整合最新版MybatisPlus 3.3.1版本
springboot2.2.X手册:对象复制哪种最快?7种复制方式性能对比