Maven
Maven学习目录
1、Maven技能树
2、了解项目管理工具
2.1 项目管理工具诞生的原因
- jar包难以寻找
- jar包依赖的问题
- jar包版本冲突问题
- jar不方便管理
- 项目结构五花八门
- 项目的生命周期控制方式五花八门
2.2 有哪些项目管理工具
- Ant
- Maven
- Gradle
3、什么是Maven
3.1 Maven的形成
- Maven最初是为了简化 一个用
Jakarta Turbine
框架开发的Web项目中的构建过程
的一个工具。 - 提到项目构建,在以前比较火热的是
Apache Ant
这个构建脚本工具;Ant火热代表了当时它很好用,但有两个致命缺点:- 有几个项目,每个项目都有自己的 Ant 构建文件,都略有不同
- 无法管理依赖
- 为了解决上述需求,Maven就这样诞生了:
- 在具备Ant功能的基础上,打造一种可以用于构建和管理任何基于 Java 的项目的工具,提供:
- 标准方法(对象模型POM)
- 对项目组成的清晰定义(结构)
- 一种发布项目信息(部署)的简单方法
- 一种在多个项目之间共享 JAR (中央仓库)的方法
- 在具备Ant功能的基础上,打造一种可以用于构建和管理任何基于 Java 的项目的工具,提供:
3.2 Apache Ant
对比Apache Maven Project
Apache Ant: 软件构建工具
Apache Maven Project: 软件项目管理和理解工具
- 使用Project Object Model来对软件项目管理
- 内置了更多的隐式规则,使得构建文件更加简单
- 内置依赖管理和Repository来实现依赖的管理和统一存储
- 内置了软件构建的生命周期
3.3 Maven的目标
Maven 的主要目标是让开发人员在最短的时间内了解任何基于 Java 的项目。为了实现这个目标,Maven 处理了几个关注的领域:
- 简化构建过程
- 提供统一的构建系统
- 提供优质项目信息
- 鼓励更好的开发实践
3.4 总结
- Maven是一个管Java项目的管理工具,主要管构建、打包、部署(全生命周期的管理)
- Maven通过对象模型-Project Object Model(pom)来对软件项目管理
- Maven的项目结构有一些显示和隐式规则
4 Maven的下载、安装以及配置
4.1 下载
4.2 安装
1、直接将tar.gz的文件夹解压到你指定的目录(想放哪放哪,别用中文命名)
2、配置环境变量:MAVEN_HOME
、PATH
MAVEN_HOME:maven存放路径
PATH:%MAVEN_HOME%/bin
3、打开命令窗口测试是否配置成功:mvn -v
Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739)
Maven home: /Users/nan/DevelopmentEnvironment/apache-maven-3.8.3
Java version: 1.8.0_191, vendor: Oracle Corporation,
runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"
4、在maven
安装路径下新建文件夹repository
并修改./apache-maven-3.8.3/conf/setting.xml
默认的仓库位置
用于替换默认的
.m2
文件夹,避免占用系统盘资源
<localRepository>repository的路径</localRepository>
5、配置setting.xml
,将外网的maven官方镜像换成国内的阿里云镜像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
6、配置全局&自定义IDEA开发工具
打开IDEA后不要进入项目,然后打开preferences->Build->Build Tools->Maven
5 建一个maven项目
6 Maven四大特性
6.1 依赖管理系统
依赖: 你的项目引入了那些jar包,无论是开源的还是不开源的,这些jar就是你项目的依赖,你的项目依赖于他们才能用,比如jdbc、fastjson、jetty、slf4j等
原来依赖咋引入: 最初这些东西需要我们自己去网上找,然后下载下来、复制到项目中然后构建到项目当中去
现在Maven咋引入依赖: Maven的依赖管理相当于它做了一个公共平台,jar包提供商将下载地址托管到这个平台,使用者直接在一个统一的地方去下载各式各样的依赖,找依赖、管依赖等繁琐步骤maven给你干了,你只管确定自己要用谁家的哪个东西、哪个版本,直接通过maven提供的坐标地址下揍中咧,坐标格式如下:
<!-- <dependencies>声明:是叫引入的依赖的,都得搁这个标签里面 -->
<dependencies>
<!-- <dependency>声明引入A依赖 -->
<dependency>
<!-- <groupId>
官方解释:公司或者组织的唯一标志
人话:就是咱们建项目时的包名,人家叫com.talent.core你叫com.balala.666;com.balala.666其实也是你存储的文件夹的层 级,这个要是写的不对直接就找不着这个依赖了
-->
<groupId>com.talent.core</groupId>
<!-- <artifactId>
官方解释:项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的
人话:你就理解成你上人家那个包路径下下载jar包去,但人家的项目是个多模块的,你得确定子项目名,进去之后才能看见你要的jar
-->
<artifactId>Anyonelse-core</artifactId>
<!-- <version>
见名知意,这个就是你要下这个jar的那个版本的,有时候新的版本可能去掉了一些原有的功能,你上来就找18的小姑娘有可能受不了
-->
<version>${anyonelse_version}</version>
<!-- <dependency>声明引入B依赖 -->
<dependency>
<groupId>com.talent.core</groupId>
<artifactId>Anyonelse-core</artifactId>
<version>${anyonelse_version}</version>
</dependency>
</dependencies>
总结
- 原来你跑个一个手续要去1W个地方用时10年,现在一个手机上的APP1个小时就能把事全干了
- 原来要在项目里建一个
libraries
,然后把四处淘换来的jar粘进去,再右键导入- 自从有了Maven!妈妈再也不用担心我找不着jar包以及项目存一堆jar而导致项目过大
6.2 多模块构建
商业项目的业务往往多而杂,这个时候我们在架构层面就可能会按controller、model、services、impl、mapper、来进行模块级分层;或者根据业务分类进行模块切分,管走道的一个模块、睡觉的一个模块、拉屎的一个模块
Maven同样支持这种多模块结构,只需定义一组聚合POM(对象模型),并在配置中声明爹跟儿子之间的关系就行,这个时候儿子自动继承他爹的所有配置项;声明爹跟儿子关系的配置这么写:
<!-- <modules>声明被这个pom托管的项目是爹,并且我在下面写上了我每个儿子的名字 -->
<modules>
<!-- <module>声明儿子都有谁 -->
<module>PRODUCT-LES</module>
<module>PRODUCT-LES1</module>
<module>PRODUCT-LES2</module>
<module>...</module>
</modules>
总结
<modules>
标签清晰的声明了父子关系,儿子再也不用担心不知道上哪要钱去了
6.3 统一项目结构
开发工具是有好多种的,如eclipse、MyEclipse、spring、idea…;不同开发工具具有一些自有的目录结构以及一些文件、配置等,所以之前没有用maven的时候,当一个项目是用eclipse开发的时候再想用别的工具运行它就会出现各式各样、千奇百怪的问题,难受的一批,所以maven限制了被他托管的项目的结构;Maven项目结构如下:
my-app -- 项目名
|-- src -- 资源总目录
| |-- main -- 和src基本作用差不多
| | `-- java
| | `-- com -- 包路径 节点1
| | `-- MyCompany -- 包路径 节点2
| | `-- app -- 包路径 节点3
| | `-- controller -- 接口
| | `-- pojo -- 实体类
| | `-- services -- 接口类
| | `-- impl -- 实现类
| | `-- mapper -- 持久层
| | `-- App.java -- 启动类
| | `-- resource -- 放配置文件的
| | `-- mapper -- 这是前端部分
| | `-- beanMapper.xml -- 这是前端部分
| | `-- webapp -- 这是前端部分
| | `-- WEB-INF -- WEB-INF是Java的WEB应用的安全目录
| `-- test -- 测试用例,干掉
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- AppTest.java
`-- pom.xml -- 对象模型配置文件
6.4 一致的构建模型和插件机制
在编写 JavaWeb 项目时需要使用类似 tomcat 的服务器,我们可以通过插件的形式将服务器引入进来。例如,如果需要使用 jetty 的服务器,可以通过下面的配置将 jetty 服务器引入进来。
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<contextPath>/test</contextPath>
</configuration>
</plugin>
7、POM文件解析
8、搭建私服Nexus
8.1 nexus介绍
Nexus仅仅是私服的一种,私服是一种同中央仓库一样的远程仓库,只不过它是由自己搭建的远程仓库
- 用于存放一些无法从外部仓库下载的构件,例如内部的项目还能部署到私服上,以便供其他依赖项目使用
- 为了节省带宽和时间,在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库
8.2 为什么使用
- 节省外网带宽
- 建立本地内部公用仓库
8.3 安装&卸载
版本/收费/免费:Nexus Repository Manager 仓库管理有2个版本,专业版和oss版,oss版是免费的,专业版是收费的,我们使用oss版。
- Nexus依赖Java环境
安装
- 将下载好的
tar.gz
的包解压到指定目录 - Windows系统需要配置环境变量
- Path:nexus/bin
./nexus start
启动- start
- stop
- restart
- force-reload
- 访问
http://localhost:8081
验证是否启动是否成功- 默认用户名和密码存放文件的地址:/Users/nan/Downloads/latest-unix/sonatype-work/nexus3/admin.password
- root:admin
- pwd:admin.password文件内
- 根据提示修改默认密码
8.4 仓库分类&使用详解
hosted(宿主仓库)
- 保存中央仓库里没有的资源(jar)
- 自己开发的包
- 第三方但是不开源的包
proxy(代理仓库)
- 代理远程仓库,通过nuxus访问其他公共仓库,比如maven官方、jboos…
仓库组(group)
- 将多个仓库组成一组,简化配置
- 仓库组不能保存资源,属于设计性仓库
添加宿主仓库
仓库分为release版及snapshot版
向仓库组中添加自己创建的仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzz995qh-1644558461948)(/Users/nan/Library/Application Support/typora-user-images/image-20211101181804313.png)]
手动上传包
如需链接私服下载
- 配置本地Maven的配置文件
- 添加server
- 添加mirror
- 具体配置如下配置
<!-- 配置访问服务器的权限,用户名和密码 -->
<servers>
<!-- 其中一个需要权限访问的私服的名称、用户名、密码-->
<server>
<id>nexus-zhgc</id>
<username>aaa</username>
<password>bbb</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus-zhgc</id>
<mirrorOf>central</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
<profile>
<id>default_profile</id>
<repositories>
<!--包含需要连接到远程仓库的信息 -->
<repository>
<!--远程仓库唯一标识 -->
<id>zhanglonghao_repo</id>
<!--远程仓库名称 -->
<name>zhanglonghao_repo</name>
<!--如何处理远程仓库里发布版本的下载 -->
<releases>
<!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
<enabled>true</enabled>
<!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
<updatePolicy>never</updatePolicy>
<!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 -->
<checksumPolicy>warn</checksumPolicy>
</releases>
<!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 -->
<snapshots>
<!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
<enabled>true</enabled>
<!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
<updatePolicy>always</updatePolicy>
<!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 -->
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<!--远程仓库URL,按protocol://hostname/path形式 -->
<url>http://maven.zhanglonghao.work:8081/nexus/content/groups/public</url>
<!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>http://maven.zhanglonghao.work:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!-- activeProfiles
| List of profiles that are active for all builds.
-->
<activeProfiles>
<activeProfile>default_profile</activeProfile>
</activeProfiles>
8.5 资源自动上传私服
上传资源时需要提供
- 自己项目打好的包要传到私服中那个宿主仓库中
- 在对应的pom中添加如下配置
<!-- 说明将通过本pom管理的项目打好的包上传到私服中那个宿主仓库-->
<distributionManagement>
<!-- 稳定版本用这个-->
<repository>
<!-- 要和私服中宿主仓库名、setting中配置的名称一致-->
<id>zhgc-release</id>
<!-- 仓库地址-->
<url>http://10.10.1.104:8931/repository/zhgc-release/</url>
</repository>
<!-- 快照版本用这个-->
<snapshotRepository>
<id>zhgc-snapshots</id>
<url>http://10.10.1.104:8931/repository/zhgc-snapshots/</url>
</snapshotRepository>
</distributionManagement>