传统项目管理现状:

基于以上问题,Maven出现了。
Maven介绍

Maven的作用:

下载
Maven下载地址:https://maven.apache.org/download.cgi

安装
解压zip文件(Maven属于绿色版软件,解压即安装)

打开文件夹后,各目录的解释:

环境变量的配置


做完以上,打开cmd窗口,输入mvn,以下即是配置成功

仓库
仓库,用于存储各种资源。简单狭义的讲,存jar包的
如上图:
本地仓库,即我本地计算机中保存的jar包。
工作中,需要某jar包,我们可以去远端的某台服务器上去下载,即中央服务器,对应存储jar包的位置,就叫中央仓库,这个仓库是Maven开发团队服务维护的。
但如果每个人都去中央仓库下载,再加上境外、带宽等因素,下载效率必然很低。由此,私服诞生,这是公司自己的仓库,一般为局域网级别。

☀☀☀
私服的作用:
坐标

坐标,用来描述仓库中资源的位置,https://repo1.maven.org/maven2/

Maven坐标的主要组成:

鉴于Maven坐标的组成方式,这样搜索是不对的,再者,Maven坐标是给Maven工具用的,它会按照我们提供的坐标去查找、下载、使用这个资源。
坐标的获取:
进入https://mvnrepository.com/,搜索关键字,锁定后选择版本号

复制Maven下的地址即坐标:

junit junit 4.13 test
仓库配置
在cmd窗口执行mvn后,可以看到在C盘下新增了这个目录,即本地仓库的位置

更改本地仓库的位置,需要修改配置文件,即安装Maven的conf目录下的settings.xml文件

和本地仓库一样,在setting.xml文件中加入以下配置,用阿里云提供的开源仓库代替maven的中央仓库:
nexus-aliyun centralNexus aliyun http://maven.aliyun.com/nexus/content/groups/public
(到此对镜像的理解又加深了,即和镜子对面的本体一样,但又有其自身的灵活性和优势)
添加在这里:

到此,关于仓库的配置,从哪儿下载,下载好以后存本地的哪儿,就都写明白了。
全局setting和用户setting
以上的配置即全局setting,定义了当前计算机中Maven的公共配置,而用户setting即针对每个登录用户,可以做自己的个性化配置。

在上面用户的maven目录下,和repository同级的地方复制一份setting文件过来,公共配置和全局setting中的不一样时,用户setting覆盖全局setting
- Maven工程目录结构
Maven的工程结构如图:

- 代码准备
照着以上的目录结构,在本地某盘中新建出一个同样结构的目录,在main目录的java文件夹下新建Demo.java:

package com.llg;public class Demo{public String say(String name){System.out.println("hello!" + name);return "hello!" + name;}
}
同样在test目录下的java文件夹下,写一个DemoTest.java的测试程序:
package com.llg;import org.junit.Test;
import org.junit.Assert;public class DemoTest{@Testpublic void testSay(){Demo d = new Demo();String ret = d.say("maven");Assert.assertEquals("hello!maven",ret);}
}
在src目录下新建pom.xml文件,文件内容如下:

- 手动构建指令
Maven的构建命令使用mvn开头,后面添加功能参数,可以一次执行多个指令,使用空格分隔
- mvn compile 编译
- mvn clean 清理编译出来的结果
- mvn test 测试
- mvn package 打包
- mvn install 安装到本地仓库
打开DOS窗口,


在cmd窗口输入指令mvn compile:
运行结果报这个错误的时候,是maven的setting文件中写的jdk版本的问题,解决参考这篇https://blog.csdn.net/qq_45737419/article/details/106790054

编译成功如下图:


cmd窗口执行指令mvn clean,则刚才编译产生的文件夹target就被删除了
mvn clean
执行mvn test,结果中可以看到:执行成功1个,失败0个,跳过0个

接下来执行mvn package来进行打包:

在target目录下,可以看到打包成功的jar包:

接下来执行mvn install,将上一步打好的jar包安装到我们本地的仓库。

☀30个常用的Maven指令:
https://zhuanlan.zhihu.com/p/29208926
使用mvn插件创建Maven工程
手动创建Maven项目的时候,按照以上一步步去创建目录,再各种新建文件,流程繁琐。可以使用mvn插件直接创建Maven工程。
对于 Maven 插件而言,为了提高代码的复用性,通常一个 Maven 插件能够实现多个功能,每一个功能都是一个插件目标,即 Maven 插件是插件目标的集合。我们可以把插件理解为一个类,而插件目标是类中的方法,调用插件目标就能实现对应的功能。

在cmd窗口执行以上指令创建项目,对比Java工程和web工程在结构上的区别:

在IDEA中创建一个空的工程,取名maven-project:

接下来配置maven,先选择project的SDK:

接下来file–setting,搜索maven:

修改home path和setting文件的路径,点击apply。这里的maven版本选择低一些,比如3.6.1,低版本下载地址https://archive.apache.org/dist/maven/maven-3/

点击新建模块java001,效果如图:

修改pom文件的内容,添加依赖junit:

写java源程序Demo和测试程序DemoTest:

点击右侧生命周期管理,进行测试、编译等:

除了右侧,也可在这里配置相关的操作:

可以看到编译测试等操作均成功运行:

接下来使用IDEA的模板来快速创建Maven工程:

接下来一路next后点击Finish,等待下载完成:

点击新建目录,创建resources,Make Directory as:

接下来创建Web项目:
继续点击IDEA右上角快捷创建模块,选择maven,搜索web:

接下来一路next–finish–OK,然后等待加载:
这里加载可能会卡住或者超级慢,可以考虑这三个解决帖子:
https://blog.csdn.net/xwhokay/article/details/122930149
https://blog.csdn.net/qq_38723677/article/details/124795928
https://blog.csdn.net/Zlucien/article/details/114671636
成功后项目结构如下:

根据自己的需要再修改一下即可:

下面是Tomcat插件安装和web工程的启动:
进入maven坐标库,搜索tomcat maven,进入这个:

进入后选择第一项就是需要的插件:

选择2.1版本后,复制坐标:

org.apache.tomcat.maven tomcat7-maven-plugin 2.1
然后进入pom.xml文件,使用build标签来添加插件:

这时查看右侧Maven可以看到插件(标红是因为正在下载,稍等刷新)

双击tomcat7:run,开始运行:

启动成功:

到此,整体说明一下pom文件各个参数的含义。pom.xml文件的模板:
4.0.0 com.winner.trade trade-core 1.0.0-SNAPSHOT jar ... com.winner.trade trade-test 1.0.0-SNAPSHOT test false org.slf4j slf4j-api UTF-8 1.5 1.5 ...
myPorjectName ${basedir}/target install ../filter.properties resources true src/main/resources **/*.properties **/*.xml jdbc.properties ${basedir}\src\main\java ${basedir}\src\main\scripts ${basedir}\src\test\java ${basedir}\target\classes ${basedir}\target\test-classes org.apache.maven.wagon wagon-ssh 2.8 maven-assembly-plugin 2.5.5 assembly package single false ${finalName} false assembly.xml false ... true ...
依赖配置
依赖配置即当前项目运行所需的jar包,一个项目可以设置多个依赖
com.winner.trade trade-test 1.0.0-SNAPSHOT test false org.slf4j slf4j-api
依赖传递
项目1需要用到项目2,则在pom文件中复制项目2自身的坐标,写到项目1的

图示:

依赖传递途中,出现了两个不同版本的同一个jar包,优先级理论如下:

理解就行,工作时刷新右侧Maven,出来哪个自然就是哪个生效了。
可选依赖(不透明)
即,引用我的人看不到我是否用了这个依赖。不想让别人知道我用过这个资源。
false
java001引用java002,本来可以看到2中引用了log4j:

被引用的2不想让别人知道引用了log4j,则加optional:

总结即:被引用方隐藏自己依赖的部分jar
排除依赖(不需要)
即:主动断开依赖的资源,这时不用写版本,三坐标中的version不用
org.slf4j slf4j-api
引用方001,默认可以看到被引用的002的依赖关系,如log4j:

接下来引用方001来主动排除002中的依赖:

可选依赖是控制这个资源会不会被引用方看到,排除依赖是引用方去主动断开这个依赖
依赖范围
依赖的jar默认在任何地方都可以使用,可以通过scope标签来更该其作用范围

标签内容取值如下表:

依赖范围具有传递性:

生命周期,即人几岁的时候,插件即在几岁的时候干的某件事
构建生命周期
项目构建的整体生命周期如下:

phase标签中填入以下哪个值,则该值及之前的过程全部执行:



插件

使用build标签来添加插件:

execution标签即执行,phase标签即说明插件在哪个阶段执行,goal标签的取值说明:

jar 用于将项目的主要源代码捆绑到 jar 存档中。