Apache Maven是一个软件项目管理的综合工具。基于项目对象模型(POM)的概念,提供了帮助管理构建、文档、报告、依赖、发布等方法,Maven简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven增加可重用性并负责建立相关的任务。
可以将项目过程规范化、自动化、高效化以及强大的可扩展性,利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。
使得项目的管理变得容易,构建项目的速度更快,由于Maven提供了仓库的概念去管理jar包,所以用git或者svn的时候,存储构建的项目体积会更小。
管理项目的构建、文档生成、报告、依赖、SCMs(software configuration Management)、分布、分发、邮件列表。
采用远程仓库和本地仓库以及一个核心的配置文件pom.xml,pom.xml中定义的jar文件从远程仓库下载到本地仓库,各个项目使用同一个本地仓库的jar,同一个版本的jar只需下载一次,而且避免每个应用都去拷贝jar。同时它采用了现在流行的插件体系架构,所以maven的核心非常的小,只有几兆大小的文件,在执行maven任务时,才会自动下载需要的插件。
具体的概念模型如下图:
Maven官方把maven定义为一个项目管理工具,下面我们来看看maven给我们的项目管理做了哪些工作?
Maven项目具有统一的项目结构,这个项目结构是参考业界的最佳实践而成,为后面使用统一的maven命令打下了基础,如测试mvn test、打包mvn package等,无需写一行脚本,就可以方便的实现众多功能。
使用mvn site可以快速生成项目站点,apache很多开源项目站点都采用maven生成,会出现built by maven字样的图标。
类库管理是maven一个比较核心的功能,我们就需要将项目所依赖的类库加入到pom.xml中,那么maven会自动将依赖的类库下载到本地,并且下载的类库如果还依赖其他的类库,它也会自动下载过来,这样我们就不需要一个一个类库去下载了。
发布管理
使用maven可以方便的进行项目发表管理。在项目开发到一定阶段,可以使用mvn package打包,它会自动先运行mvn test,跑所有的Test Case,只有全部通过才能正确打包。生成的war包(如果项目的packaging为war)在target目录下。这个 war包与使用ant脚本生成一样,但无需一行脚本,这也是maven对比ant的优势之一。使用mvn install将编译和打包好的文件发布到本地仓库中。使用mvn deploy在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository。
官网地址:http://maven.apache.org/
Maven下载地址:http://maven.apache.org/download.cgi
这里我两个环境的版本都下载,分别在我本机和linux虚拟机安装。
# 解压的目录
D:\software\Maven\apache-maven-3.8.4-bin
依赖Java,需要配置JAVA_HOME,没有装jdk的还得先装jdk
设置Maven自身自身的运行环境,需要配置MAVEN_HOME
配置完JAVA_HOME和MAVEN_HOME,还得配置Path,在Path加上:%JAVA_HOME%\bin和%MAVEN_HOME%\bin
# 这里使用git bash
$ java -version
$ mvn -v
# 创建本地存放jar包目录
D:\software\Maven\repository
# 找到maven安装目录下conf/settings.xml
先查找默认的配置,在lib目录下随便找个jar包用解压工具打开-》再回到上层目录-》ctrl+F搜索pom*.*找到pom-4.0.0.xml-》把这个文件拖出来打开
但是注意不是去修改jar包里面的这个配置,还是回到conf/setting.xml这个配置文件,修改这个配置文件。
<mirror>
<id>nexus-aliyunid>
<mirrorOf>centralmirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
$ mkdir -p /opt/software
$ cd /opt/software
$ wget https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
$ tar -zvxf apache-maven-3.8.4-bin.tar.gz -C /opt/software/
# 在/etc/profile
export PATH=/opt/software/apache-maven-3.8.4/bin:$PATH
# 加载生效
$ source /etc/profile
$ java -version
$ mvn -v
默认git bash是没有tree命令的,这里提供下载地址:
官网下载地址:http://gnuwin32.sourceforge.net/packages/tree.htm
百度云下载地址:
链接:https://pan.baidu.com/s/17fc79rQUQSnBhWzej9xd9g
提取码:6666
把tree.exe放到git安装目录下的usr/bin/目录下
### 查看创建的目录和目录结构
$ tree hello/
$ cat hello/src/main/java/com/test2022/Hello.java
$ cat hello/src/test/java/com/test2022/HelloTest.java
$ cat hello/pom.xml
$ cd hello
$ mvn compile
发现编译报错了:
【问题】 [ERROR] 不再支持源选项 5。请使用 7 或更高版本。
[ERROR] 不再支持目标选项 5。请使用 7 或更高版本。
<profile>
<id>jdk-13id>
<activation>
<activeByDefault>trueactiveByDefault>
<jdk>13jdk>
activation>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>13maven.compiler.source>
<maven.compiler.target>13maven.compiler.target>
properties>
profile>
<properties>
<maven.compiler.target>13maven.compiler.target>
<maven.compiler.source>13maven.compiler.source>
properties>
这里我采用【解决方案一】修改全局的配置
再编译,编译成功
$ mvn compile
$ mvn clean
# 发现上面编译产生的target目录会删掉
$ tree .
$ mvn test
【温馨提示】这里只打包编译好的源程序(xxx.class文件)
$ mvn package
【温馨提示】这里groupid决定放在仓库的哪个文件下,配置
com.hello ,所以生成的包就会放在仓库目录的com/hello目录下。
会经历编译(compile)-》测试(test)-》打包(package) -》安装(install)的过程。
模板:
mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
示例:
$ mvn archetype:generate -DgroupId=com.test2022 -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false
$ mvn archetype:generate -DgroupId=com.test2022 -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false
【温馨提示】IDEA官网下载地址:https://www.jetbrains.com/idea/
File->Settings,把默认配置自带的maven修改上面下载的版本
发现main和test里面都没创建resources,下面我们手动创建
在maven库中搜索tomcat:https://mvnrepository.com/
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.1version>
<configuration>
<port>80port>
<path>/path>
configuration>
plugin>
plugins>
build>
【温馨提示】默认端口是8080,上面配置的80
发现报错了
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
【原因&解决】是因为默认创建的web.xml配置文件里有spring的配置,先把这些配置删掉就行。最后web.xml只保留如下内容:
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
web-app>
依赖指当前项目运行所需的jar包,一个项目可以设置多个依赖,示例如下:
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
dependencies>
依赖具有传递性:
可选依赖指对外隐藏当前所依赖的资源----不透明
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<optional>trueoptional>
dependency>
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本----不需要
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<exclusions>
<exclusion>
<groupId>org.hamcrestgroupId>
<artifactId>hamcrest-coreartifactId>
exclusion>
exclusions>
dependency>
带有依赖范围的资源在进行传递时,作用范围将受到影响
Maven构建生命周期描述的是一次构建过程经历了多少的事件
【温馨提示】:像compile、test、test-compile、package、install等,排在它们前面的步骤都会执行。图示如下:
插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能,默认maven在各个生命周期上绑定有预设的功能,通过插件可以自定义其他功能。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-source-pluginartifactId>
<version>2.2.1version>
<executions>
<execution>
<goals>
<goal>jargoal>
goals>
<phase>generate-test-resourcesphase>
execution>
executions>
plugin>
plugins>
build>
项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本),快照版本会随着开发的进展不断更新。
项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本。
工程版本号约定规范:
【版本格式】<主版本>.< 次版本>..<里程碑版本>
【范例】
5.1.9.RELEASE或5.1.9-RELEASE
一般公司至少有三套环境(开发、测试、生产),如果每次把程序打包好上传到对应的环境之前就得更改一下配置,是很烦的操作,所以就有了这里的多环境资源配置了。
示例:
<profiles>
<profile>
<id>devid>
profile>
<profile>
<id>testid>
profile>
<profile>
<id>proid>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_dbjdbc.url>
properties>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
profiles>
通过命令加载指定环境
【调用格式】mvn 指令 -P 环境定义id
【示例】
$ mvn install -P pro
【调用格式】mvn 指令 –D skipTests
<plugin>
<artifactId>maven-surefire-pluginartifactId>
<version>2.22.1version>
<configuration>
<skipTests>trueskipTests>
<includes>
<include>**/User*Test.javainclude>
includes>
<excludes>
<exclude>**/User*TestCase.javaexclude>
excludes>
configuration>
plugin>