Maven

Maven学习目录

  • Maven
    • 1、Maven技能树
    • 2、了解项目管理工具
      • 2.1 项目管理工具诞生的原因
      • 2.2 有哪些项目管理工具
    • 3、什么是Maven
      • 3.1 Maven的形成
      • 3.2 `Apache Ant`对比`Apache Maven Project`
      • 3.3 Maven的目标
      • 3.4 总结
    • 4 Maven的下载、安装以及配置
      • 4.1 下载
      • 4.2 安装
    • 5 建一个maven项目
    • 6 Maven四大特性
      • 6.1 依赖管理系统
        • 总结
      • 6.2 多模块构建
        • 总结
      • 6.3 统一项目结构
      • 6.4 一致的构建模型和插件机制
    • 7、POM文件解析
    • 8、搭建私服`Nexus`
      • 8.1 nexus介绍
      • 8.2 为什么使用
      • 8.3 安装&卸载
        • 安装
      • 8.4 仓库分类&使用详解
          • hosted(宿主仓库)
          • proxy(代理仓库)
          • 仓库组(group)
        • 添加宿主仓库
        • 手动上传包
        • 如需链接私服下载
      • 8.5 资源自动上传私服
    • 9 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 (中央仓库)的方法

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_HOMEPATH

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环境

官网传送门

官方下载传送门

Docker Hub

官方安装文档

安装

  • 将下载好的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>

9 Maven使用过成中常见报错&解决方案

Maven读这一篇就够了相关推荐

  1. 图解Word2vec,读这一篇就够了(通俗易懂)

    大数据文摘出品 作者:Jay Alammar 编译:张秋玥.毅航.高延.龙心尘 嵌入(embedding)是机器学习中最迷人的想法之一. 如果你曾经使用Siri.Google Assistant.Al ...

  2. 收藏 | 图解Word2vec,读这一篇就够了!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:大数据文摘 ...

  3. 图解Word2vec,读这一篇就够了!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 来源:大数据文摘,推荐人:张帆 嵌入(embedding)是机器学习中最 ...

  4. BERT大火却不懂Transformer?读这一篇就够了 重点 命名实体识别

    bert_config.josn 模型中参数的配置 { "attention_probs_dropout_prob": 0.1, #乘法attention时,softmax后dro ...

  5. BERT大火却不懂Transformer?读这一篇就够了

    本文转自:深度学习初学者 大数据文摘与百度NLP联合出品  编译:张驰.毅航.Conrad.龙心尘 前一段时间谷歌推出的BERT模型在11项NLP任务中夺得SOTA结果,引爆了整个NLP界.而BERT ...

  6. 各种HDR标准的技术细节,读这一篇就够了

    笔者按:最近要做算法层面的HDR/SDR互相转换相关的内容,但是对HDR相关的内容真的没有一个很全面的认识.HDR转SDR还好,都是0~255的8bit图像:但是如果SDR转HDR,转换出来的图像在不 ...

  7. iOS进阶 - pod install 与 pod update 读这一篇就够了

    前言 在使用CocoaPods时,难免会混淆 pod install 和 pod update 的用法,于是在官网找到了相应的说明文章,并决定翻译过来,供大家学习. 以下内容来自:pod instal ...

  8. linux表示文件连接数,linux中连接数过多(TIME_WAIT/CLOSE_WAIT)读这一篇就够了

    根据TCP/IP介绍,socket大概包含10个连接状态.我们平常工作中遇到的,除了针对SYN的拒绝服务攻击,如果有异常,大概率是TIME_WAIT和CLOSE_WAIT的问题.TIME_WAIT一般 ...

  9. Redis入门,读这一篇就够了

    目录 一. redis 1.1.什么是NOSQL 1.1.1.    NOSQL和关系型数据库比较 1.1.2.    非关系型数据库的优势: 1.1.3.    关系型数据库的优势: 1.1.4.  ...

最新文章

  1. c++获取可用端口号_PG高可用架构实施方案
  2. 判断一个点是否在三角形内部
  3. PHP 抽象工厂模式(Kit模式)
  4. 三极管基极限流电阻计算
  5. 传统图像降噪算法之BM3D原理详解
  6. open gapps各版本详细介绍
  7. 手机浏览器一键跳转微信加好友和公众号关注的方法
  8. 【人民币识别】基于RGB颜色空间实现人民币序列号识别含Matlab源码
  9. python ffmpeg剪辑视频_FFmpeg精准时间切割视频文件
  10. hulu技术宣讲|西安电子科技大学专场
  11. 数据分析常用名称、统计分析模型 SUS、CLV、VOC、认知失调、 体验度量
  12. 时间复杂度和空间复杂度复习 (一)
  13. 51单片机-WIFI模块
  14. ARFoundation☀️ 八、SARF:ARFoundation可视化插件
  15. GSM系统信令接续流程
  16. mx解析和邮件服务器,邮件交换记录(MX)解析和查询
  17. 直升机航模倾斜器研究总结
  18. meep php,PHP在TIDB上遇到的坑
  19. python文本分析和提取_python文本分析和提取 Python 文本内容指定字段提取
  20. Python爬虫——下载PPT模板

热门文章

  1. Mac Xshell 下载 (FinallShell)
  2. 【微软内推】微软2023届校园招聘开始啦
  3. Java 添加Word文本水印、图片水印
  4. Java实现 kiosk模式,適用於Linux Java Swing應用程序的Kiosk模式
  5. 原来在Android中请求权限也可以有这么棒的用户体验(转自郭霖)
  6. 华为手机鸿蒙更新时间,华为手机版鸿蒙系统更新时间介绍
  7. 数据结构:新冠病毒检测
  8. ( 算法树之几何 )【 皮克定理 】
  9. 微信小程序持续集成方案
  10. 如何知道PDF是不是正常的A4大小尺寸?