同系列文章导读:【JavaWEB】文章导读

所有文章均在本博客首发,其他平台同步更新

如有问题,欢迎指正(评论区留言即可)

发表评论时请填写正确邮箱,以便于接收通知【推荐QQ邮箱】


基本概念

传统项目管理状态分析

  • jar包不统一,jar包不兼容
  • 工程升级维护过程操作繁琐
  • ......

Maven是什么

  • Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型
  • POM(Project Object Model):项目对象模型

作用

  • 项目构建:提供标准的、跨平台的自动化项目构建方式
  • 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
  • 统一开发结构:提供标准的、统一的项目结构

下载与安装

仓库

  • 仓库:用于存储资源,包含各种jar包

jar包获取过程:先在本地仓库查找,如果没有,就去中央仓库获取

中央仓库由Maven开发团队自己维护,包含了全世界99%的jar包

  • 中央仓库不在国内,随着用户的增多,下载速度可能会很慢

    对应的解决方法就是私服,就是自己的公司服务器从中央仓库获取到自己所需的资源,保存到私服,速度非常快

分类

  • 本地仓库:用于存储资源,包含各种jar包
  • 远程仓库:非本机电脑上的仓库,为本地仓库提供资源

    • 中央仓库:Maven团队维护,存储所有资源的仓库
    • 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源

私服的作用

  • 保存具有版权的资源,包含购买或自主研发的jar

    • 中央仓库中的jar都是开源的,不能存储具有版权的资源
  • 一定范围内共享资源,仅对内部开放,不对外共享

坐标

什么是坐标?

主要组成

  • groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
  • artifactId:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
  • version:定义当前项目版本号
  • packaging:定义该项目的打包方式(不属于Maven坐标,会用到,简单了解)

作用

  • 使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

仓库配置

生成本地仓库

  • 使用win+R打开命令行输入MVN
  • 在C盘,user目录下,对应你的用户名下会生成一个m2文件夹,就是本地仓库

自定义本地仓库位置

  • 在D盘新建一个目录,在该目录下创建一个repository文件夹作为本地仓库
  • 修改mvean的安装文件夹中conf下的settings.xml文件
  • 把settings.xml文件,复制到自定义仓库目录下(和respository同层)

Maven启动后,会自动保存下载的资源到本地仓库

  • 默认位置

    <localRepository>${user.home}/.m2/repository</localRepository>

    当前目录位置为登录用户名所在目录下的.m2文件夹中

  • 自定义位置

    <localRepository>E:\maven\repository</localRepository>

    当前目录位置为E:\maven\repository文件夹中,要求此目录同级必须有一个setting.xml文件

  • 在用户setting文件中配置阿里云镜像仓库

    <mirrors>
        <!--配置具体的仓库下载镜像-->
        <mirror>
            <!--此镜像的唯一标识符,用来区分不同的mirror元素-->
            <id>nexus-aliyun</id>
            <!--对哪种仓库进行镜像,简单说就是替代哪个仓库-->
            <mirrorOf>central</mirrorOf>
            <!--镜像名称-->
            <name>Nexus aliyun</name>
            <!--镜像URL-->
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>

    修改配置后别忘了替换本地仓库中的setting文件

全局setting与用户setting区别

  • 全局setting定义了当前计算机中Maven的公共配置
  • 用户setting定义了当前用户的配置
  • 这两个东西尽量保持一致

快速入门

手工制作

目录结构

pom.xml文件(与src同级)

<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
  
    <groupId>top.hellocode</groupId>
    <artifactId>project</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
        </dependency>
    </dependencies>
</project>

Maven项目构建命令

  • Maven构建命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分割

    mvn compile        # 编译
    mvn clean        # 清理
    mvn test        # 测试
    mvn package        # 打包
    mvn install        # 安装到本地仓库

    在pom.xml所在文件夹内执行上述 DOS命令(cmd)

    第一次执行上述指令,都会先下载对应的插件等等

插件创建工程

  • 创建工程

    mvn archetype:generate
        -DgroupId={project-packaging}
        -DartifactId={project-name}
        -DarchetypeArtifactId=maven-archetype-quickstart
        -DinteractiveMode=false

范例

  • 创建Java工程

    mvn archetype:generate -DgroupId=top.hellocode -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  • 创建web工程

    mvn archetype:generate -DgroupId=top.hellocode -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

使用插件创建工程要求所在文件夹不是一个maven工程的目录,也就是没有pom.xml文件

web工程目录比Java工程目录多一个webapp目录

IDEA生成

配置Maven

  • IDEA2019版本对3.6.2及以上版本存在兼容性问题,为避免冲突,IDEA中安装使用3.6.1版本

    这里我使用的IDEA是2021版本,使用3.8.1及以下的maven版本没有问题,只需要在maven官网下载3.8.1的版本,解压,将之前配置好的setting文件替换掉新下载的setting文件即可

创建Maven工程

骨架创建Maven工程

Java工程

web工程

Tomcat插件安装与web工程启动

web01的pom:

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
-->
<!-- $Id: pom.xml 642118 2008-03-28 08:04:16Z reinhard $ -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <!--指定pom的模型版本,默认会加-->
  <modelVersion>4.0.0</modelVersion>
  <!--打包方式,Java是jar,web是war-->
  <packaging>war</packaging>

  <!--组织ID-->
  <groupId>top.hellocode</groupId>
  <!--项目ID-->
  <artifactId>web01</artifactId>
  <!--版本号:release(完成版),SNAPSHOT(开发版)-->
  <version>1.0-SNAPSHOT</version>


  <!--设置当前工程的所有依赖-->
  <dependencies></dependencies>
  <!--构建-->
  <build>
    <!--设置插件-->
    <plugins>
      <!--具体插件配置-->
      <plugin>
        <!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.1</version>
          <configuration>
            <!--端口-->
            <port>80</port>
            <!--虚拟路径-->
            <path>/</path>
          </configuration>
      </plugin>
    </plugins>
  </build>
</project>
具体的插件配置中的内容可以在https://mvnrepository.com/中复制

启动

配置tomcat


依赖管理与生命周期

依赖配置与传递

  • 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
  • 格式

    <!--设置当前项目所依赖的所有jar-->
    <dependencies>
        <!--设置具体的依赖-->
        <dependency>
            <!--依赖所属群组id-->
            <groupID>junit</groupID>
            <!--依赖所属项目id-->
            <artifactID>junit</artifactID>
            <!--依赖版本号-->
            <version>4.12</version>
        </dependency>
    </dependencies>

依赖传递

依赖具有传递性
  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
这两个是相对概念

冲突问题

  • 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

可选依赖

  • 可选依赖指对外隐藏当前所依赖的资源——不透明

    <dependency>
        <groupID>junit</groupID>
        <artifactID>junit</artifactID>
        <version>4.12</version>
           <!--设置不透明(默认false)--> 
        <optional>true</optional>
    </dependency>

排除依赖

  • 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本——不需要
<dependency>
    <groupID>junit</groupID>
    <artifactID>junit</artifactID>
    <version>4.12</version>
    <!--排除依赖-->  
    <exclusions>
        <exclusion>
            <!--不需要写版本,是排除所有-->
            <groupID>junit</groupID>
            <artifactID>junit</artifactID>
        </exclusion>
    </exclusions>
</dependency>

依赖范围

  • 依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
  • 作用范围

    • 主程序范围有效(main文件夹范围内)
    • 测试程序范围有效(test文件夹范围内)
    • 是否参与打包(package指令范围内)
scope主代码测试代码打包范例
compile(默认)YYYlog4j
test Y junit
providedYY servlet-api
runtime Yjdbc

带有依赖范围的资源在进行传递时,作用范围将受到影响(了解即可)

compiletestprovidedruntime
compilecompiletestprovidedruntime
test
provided
runtimeruntimetestprovidedruntime

生命周期与插件

项目构建生命周期

  • Maven构建生命周期描述的是一次构建过程经历了多少个事件
  • 大体分为三个阶段

    • clean:清理阶段
    • default:核心工作,例如:编译、测试、打包、部署等
    • site:产生报告,发布站点等

clean生命周期

  • pre-clean:执行一些需要在clean之前完成的工作
  • clean:移除所有上一次构建生成的文件
  • post-clean:执行一些需要在clean之后立刻完成的工作

site构建生命周期

  • pre-site:执行一些需要在生成站点文档之前完成的工作
  • site:生成项目的站点文档
  • post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy:将生成的站点文档部署到特定服务器上

生命周期中的事,都是挨着从前往后做,例如做test时,就需要先完成test之前的工作

插件

  • 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
  • 默认maven在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义其他功能
<!--构建-->
<build>
    <!--设置插件-->
    <plugins>
        <!--具体插件配置-->
        <plugin>
            <!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                       <!--执行阶段--> 
                    <phase>generate-test-resources</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

最后修改:2022 年 05 月 07 日
如果觉得我的文章对你有用,请随意赞赏