Maven读这一篇就够了

Maven

1、Maven技能树

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 image-20211026180910423

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而导致项目过大

image-20211026184252703

img

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项目结构如下:

image-20211017175309517

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仅仅是私服的一种,私服是一种同中央仓库一样的远程仓库,只不过它是由自己搭建的远程仓库

  • 用于存放一些无法从外部仓库下载的构件,例如内部的项目还能部署到私服上,以便供其他依赖项目使用
  • 为了节省带宽和时间,在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库

img

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文件内
  • 根据提示修改默认密码

image-20211101180141504

8.4 仓库分类&使用详解

hosted(宿主仓库)
  • 保存中央仓库里没有的资源(jar)
    • 自己开发的包
    • 第三方但是不开源的包
proxy(代理仓库)
  • 代理远程仓库,通过nuxus访问其他公共仓库,比如maven官方、jboos…
仓库组(group)
  • 将多个仓库组成一组,简化配置
  • 仓库组不能保存资源,属于设计性仓库

添加宿主仓库

仓库分为release版及snapshot版

image-20211101181551211

image-20211101181629389

向仓库组中添加自己创建的仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzz995qh-1644558461948)(/Users/nan/Library/Application Support/typora-user-images/image-20211101181804313.png)]

手动上传包

image-20211101182030350

image-20211101182244150

如需链接私服下载

  • 配置本地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>

image-20211101184842779

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

猜你喜欢

转载自blog.csdn.net/qq_37768368/article/details/122878924