一、简介
1、介绍
maven主要服务于基于java平台的项目构建,依赖管理和项目信息管理。
就像是java的工具库,想用什么工具就在maven里面引入对应的依赖
瀑布模型:需求明确,传统开发模式,每一步按部就班。
敏捷开发:快速迭代,可以比较创新,需求不需要很明确,流行的开发模式。
2、项目构建
如果项目比较复杂的话,项目构建(build)会花很多时间,比方说有很多依赖,很多微服务。maven实现了这个过程的自动化,只需要一条命令就能像流水线一样完成。
3、工具
1️⃣ Ant构建
早期的构建工具,缺点是xml脚本编写格式让xml文件特别大,但在当时很流行,控制效果也很好,非常灵活。
2️⃣ Maven
**项目对象模型,通过其描述信息来管理项目的构建,报告和文档的软件项目管理工具。**填补了Ant缺点,并且首次支持从网络下载功能,使引入依赖变得非常非常方便快捷,仍然采用xml作为配置文件格式。Maven专注于依赖管理,使用java编写。
3️⃣ Gradle
结合以上两个的优点,继承了Ant的灵活和Maven的生命周期管理,被Google作为android御用管理工具。使用DSL格式,让脚本更简洁。
4️⃣ 总结
Ant比较早期,一些传统的软件公司会使用,Maven是目前主流的构建工具,gradle比较新型,未来有发展空间。
4、Maven四大特性
总结来说就是规定了一些规范,让依赖管理变得非常舒服。
1️⃣ 依赖管理系统
在java世界中,可以用groupId、artifactId、version组成的Coordination(坐标)唯一标识一个依赖。
① groupId
项目隶属的实际项目-公司名称。一个项目可能有多个模块
② artifactId
定义项目中的一个Maven模块-项目名,推荐的做法是使用实际项目名称作为artifactId的前缀,比如spring-bean
③ version
定义项目当前所处的版本
这样就能直接在网络上引入依赖,不需要下载到本地了,非常非常灵活方便。
2️⃣ 多模块构建
可以打一个pom包,然后构建子包,这样在父包引入的依赖所有子包都可以直接用,树形结构,非常棒。
3️⃣ 一致的项目结构
Conversion over configuration 约定大于配置,制定了项目目录标准,解决不同IDE文件目录不一致的问题。
4️⃣ 一致的构建模型和插件机制
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
</plugin>
</plugins>
</build>
二、IDEA编辑器集成Maven环境
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ktGqJRcq-1632634543674)(C:\Users\caoyb\AppData\Roaming\Typora\typora-user-images\image-20210925213624862.png)]
这个地方可以全局配置自己的maven,我目前没感受到idea自带的有什么问题,先记录一下。
三、Maven项目的创建
1、Java项目
1️⃣ 创建Java项目
直接new Maven项目就行。
创建完之后,右下角弹出提示框,选择maven自动导入 "Enable Auto-Import"
2️⃣ 编译项目
创建一个configuration
然后就可以启动了
2、Web项目
换个模板即可,之前是quickstart,换成webapp
1️⃣ 启动项目
创建完需要做一些修改,在pom.xml里面jdk改成1.8 junit(单元测试)改成4.12 删除pluginManagement标签。
2️⃣ 添加web部署的插件
添加到build里面
① Jetty插件
<dependency>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-all</artifactId>
<version>9.0.0.v20130308</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp</artifactId>
<version>9.0.0.v20130308</version>
</dependency>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.7.v20160115</version>
<configuration>
<httpConnector>
<port>8090</port>
<host>localhost</host>
</httpConnector>
<scanIntervalSeconds>1</scanIntervalSeconds>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
②Tomcat插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>8000</port>
<!-- 请求路径 -->
<path>/erp</path>
</configuration>
</plugin>
</plugins>
</build>
启动命令换成jetty:run
四、Maven仓库的基本概念
Maven仓库分为两类:本地仓库和远程仓库
如果本地有直接用本地,没有去远程找,找不到就报错。
远程仓库分为三种:中央仓库,私服,其他公共库
中央仓库是默认配置下,Maven下载jar包的地方。
私服是一种特殊的远程仓库,在局域网架设一个私有的仓库服务器,用其代理所有外部的远程仓库,能节省带宽和时间,
可以在maven配置文件conf目录下的settings.xml来指定仓库路径。
1、中央仓库
由于原始的本地仓库是空的,maven必须知道至少一个可用的远程仓库,才能执行maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库。
2、私服
一种特殊的远程仓库,是架设在局域网内的仓库服务。当maven需要下载构件时,先去私服找,没有去外部远程仓库下载,然后缓存在私服上,为maven提供。
此外,也可以从本地上传到私服提供局域网中其他人使用。
也需要配置。
<repositories>
<repository>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>public</id>
<name>Public repositories</name>
<url>http://xxxx:xxx/content/groups/public</url>
</repository>
<repository>
<id>getui-nexus</id>
<url>http://mvn.gt.igexin.com/nexus/content/repositories/releases</url>
</repository>
</repositories>
公司建立私服的好处:
- 节省自己的外网带宽
- 加速maven构建
- 部署第三方控件
- 提高稳定性
- 降低中央仓库的负荷
3、其他公共库
常用的阿里云仓库配置
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
五、Maven的打包操作
1、 目录结构
不同环境不同目录
2、 添加Profile配置
3、设置资源文件配置
4、执行打包操作
直接在idea提供的可视化面板里操作生命周期即可
六、Maven依赖的基本概念
1、依赖的基本配置
2、依赖范围
根据环境判断依赖是否生效
3、传递性依赖
Maven能够解析间接依赖,以传递性依赖的形式引入到项目中,也就是说,当我们引入某个依赖的时候,不需要考虑他的依赖。