Maven的快速应用入门

前言

Maven技术(和Gradle)都是项目管理工具,,在学Maven之前,先理解Maven是什么?

  • jar包是什么

jar包就是别人给我们提供的Java类(jar包中也可以包含,Java源文件或者工具类中的API文档),MySQL的驱动包数据库厂商为我们提供实现JDBC面向接口编程的实现类,我们只是需要知道JDBC接口提供的方法,不需要管如何实现.还有,关于文件上传的时候,我们在是commons-fileupload.jar需要有commons-io.jar的配合使用。

在之前的开发过程中,我们都是将jar包下载下来,放置到本地的磁盘当中进行处理,但是如果硬盘坏了,那么就需要自己再重新在下载jar包,并且有可能导致下载的jar包跟原来项目的不一致,会产生一系列的错误。

而且,jar包需要下载,jar包需要维护版本,这两个方面都需要消耗我们的时间成本,影响效率

  • Maven是什么

进入maven的官方网站http://maven.apache.org/

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.

Apache Maven 是一个软件项目管理和编译工具。基于项目对象模型 (POM) 的概念,Maven 可以从一条中央信息中管理项目的构建、报告和文档。

Maven是一个采用纯Java编写的开源项目(和Tomcat一样,也是由纯Java编写),项目管理工具(使用Maven的前提需要有Java的环境,JAVA_HOME的配置),Maven是采用一种被称为POM(Project Object Model)项目对象模型(面向**项目(Java项目或者Web项目)**编程),管理就需要提供核心配置文件–>描述项目:pom.xml

一. Maven的安装

Maven的下载地址:解压的目录不要包含特殊字符和中文

(1) Maven解压目录的说明:

  • bin:包含有maven的运行脚本指令(mvn.cmd
  • boot:类加载器框架(Maven是由Java开发)
  • lib:含有Maven运行时需要Java的jar包,需要配置Java的环境变量(JAVA_HOME
  • conf:重要,包含MAVEN工具的核心配置文件settings.xml

(2)配置Maven的环境变量

可以定义两种变量名称M2_HOME(推荐,兼容老版本)和MAVEN_HOME(Maven3)

在这里插入图片描述

测试是否成功:

C:\Users\Administrator>mvn -version
Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: H:\apache-maven-3.8.1\bin\..
Java version: 13.0.2, vendor: Oracle Corporation, runtime: D:\java-tools\jdk-13.0.2
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

二. Intellij Idea 配置 Maven

新建一个空的项目,配置该项目可以使用Maven项目构建的本地工具。
在这里插入图片描述

(1)构建Java项目

注意:默认下载jar的本地仓库地址C:\Users\你的计算机用户名\.m2\repository

  • 通过修改settings.xml更改本地的仓库的位置

在这里插入图片描述

  • 构建Maven项目时,GAV保证其jar唯一
    在这里插入图片描述
  • 中央仓库下载地址

构建Maven项目的时候,从中央仓库下载需要jar包,因为国外的网址,下载速度比较慢

maven-model-builder-3.6.3.jar\org\apache\maven\model\pom-4.0.0.xml中查看

<repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

设置阿里云镜像地址(已经将中央仓库的资源更新下来,我们访问的是国内的网址),通过修改settings.xml更改下载的地址

 <mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

(2)项目目录

为什么Maven能帮我们构建项目,前提约定优于配置

Maven是项目管理工具,在没有Maven之前我们所有的项目都是由程序员自由发挥,当我们入职到公司,项目是由公司规定,造成每一个人创建项目的目录结构是不统一,我们使用Maven之后对目录就进行的规划和约定。

  • 目录说明:
    在这里插入图片描述
  • src/main:主程序目录,平时主要写项目代码的地方
    • /java:Java的源文件位置*.java,也可以(*.xml或者*.properties)但是需要设置pom.xml
    • /resources:放置的资源文件给主程序使用*.xml或者*.properties
  • src/test:项目测试代码
    • /java: Java的测试源文件
    • /resources:资源文件只能给测试目录使用

(3)仓库:保存的jar包

  • 本地仓库:当我们需要使用jar包的时候,会优先去本地仓库操作,如果本地没有需要jar包,会从中央仓库下载到本地仓库,在给项目使用,下一次就不需要再下载了
  • 中央仓库:提供所有jar包下载地址,我们使用中央仓库的镜像
  • 私服服务器:公司不允许个人电脑进行联网,当我们的项目无法在本地仓库查找需要的jar的时候,公司建立一个一台可以访问中央仓库的电脑,通过该电脑访问中央仓库(中央仓库->私服服务器中->本地仓库

(4)项目的核心配置文件pom.xml

  1. 三个必须设置的标签GAV
<groupId>com.yue</groupId>
<artifactId>maven01</artifactId>
<version>1.0-SNAPSHOT</version>
  1. <packaging>标签
  • jar:默认值,将项目打包成jar包
  • war:一般适用于WEB项目,将项目发布到webapps下,打包成*.war
  • pom:Maven是面向项目的技术,项目之间可以存在继承或者聚合关系,通过设置pom值来建立项目之间的关系
  1. <dependencies>标签
    通过GAV的设置从网络中找到需要jar包,下载到本地仓库中,推荐的网址https://mvnrepository.com/
<dependencies>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.48</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.4</version>
    </dependency>

</dependencies>
  1. <properties>标签
    提取公共的信息,方便维护
 <properties>
        <fileupload-version>1.4</fileupload-version>
        <maven.compiler.source>13</maven.compiler.source>//源码版本
        <maven.compiler.target>13</maven.compiler.target>//编译版本
    </properties>
 <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>${fileupload-version}</version>
        </dependency>
  1. <build>标签:配置插件使用
<build>
    <plugins>

    </plugins>
</build>

三. Maven的构建项目生命周期

生命周期:需要掌握:JSP的生命周期 ,Servlet的生命周期 ,Maven的生命周期

软件开发基本都会经理如下过程:

(当我们项目被测试人员回馈bug报告)->1.清除->(修改bug,编写代码->)2.编译代码->编写测试用例->3.测试->4.报告->5.打包(jar,war)->6.安装->7.部署

Maven通过设置一些生命周期指令,帮我们自动完成上述过程

  • clean:项目清理的处理,删除target目录下所有内容
  • complie:执行编译源代码,编译在此阶段完成,一般编译的是src/main/java和test/main/java
  • Test:测试使用适当的单元测试框架(例如JUnit)运行测试。测试由complie编译出来的代码(自动完成前三步)
  • package:获取compil的文件(不包含test文件夹),打包创建JAR/WAR包,打包内容只是对src/main/javasrc/main/resources进行处理
  • install:安装打包的项目到本地仓库,以供其他项目使用,通过GAV查找
  • deploy:部署拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

四. Maven中的依赖

Maven管理的三套classpath:1.编译期间的classpath(简单理解为main里面的) 2.测试期间的classpath(简单理解为test里的) 3.运行期间的classpath(简单理解为target里的)

4.1依赖作用范围

标签中包含作用范围的子标签的取值范围介绍

  • compile:默认就是compile,编译依赖范围,对所有classpath起作用
  • test:测试的依赖范围,只对测试classpath起作用
  • runtime:运行期间的依赖,对测试和运行classpath起作用
  • procided:提供依赖范围,对编译和测试起作用,对运行期间无效,经典使用引入Servlet的jar,因为我们Tomcat中已经包含Servlet API的jar,不需要将依赖的Servlet API的jar发布到项目中,造成版本重复或JAR冲突

4.2依赖传递

(1)直接依赖,间接依赖

c依赖b,b依赖a,a和b之间是直接依赖,a和c之间是间接依赖

 <dependencies>
        <dependency>
            <groupId>com.bb</groupId>
            <artifactId>maven02-B</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

通过GAV寻找并依赖

在这里插入图片描述
在这里插入图片描述

(2)依赖冲突
  1. 路径不同
    在这里插入图片描述

路径最近者优先,maven02-C使用的myaql版本为5.1.49

  1. 路径相同
    在这里插入图片描述

c依赖a,c依赖b,当路径相同时,谁先被引用使用谁后者覆盖前者

(3)排除依赖

当路径相同依赖冲突时,不想用先依赖的那个,这个时候就用到了依赖排除


    <dependencies>
        <dependency>
            <groupId>com.bb</groupId>
            <artifactId>maven02-B</artifactId>
            <version>1.0-SNAPSHOT</version>
            <!--排除依赖-->
            <exclusions>
                <exclusion>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.aa</groupId>
            <artifactId>maven02-A</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

在这里插入图片描述

五. Maven的项目聚合与继承

5.1聚合

随着互联网的发展,一个大项目不再是一个单独的项目,而是由许多小项目构成,我们不应该对每个小项目单独处理,而应该使用简单统一处理方式

 <packaging>pom</packaging>
    <modules>
        <module>../maven03-student</module>
        <module>../maven03-teacher</module>
    </modules>

在父项目中的pom.xml中用moudles标签把各个小项目聚合.对父项目操作就对所有小项目进行操作

5.2继承

一个 maven 项目可以继承另一个 maven 的依赖, 称为子项目 父项目

使用场景:

多个子项目都需要某些依赖, 就可以把子项目共同的依赖抽取到父项目中, 子项目通过继承得到这些依赖, 这样也更好的来管理(比如升级, 删除等)

使用步骤
(1) 父项目的打包方式修改为 pom
<groupId>com.ictpaas</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
(2)父项目使用 dependencyManagement标签来管理, 表示子项目默认不继承, 可以配置继承, optional 表示子 pom 无论如何都不能继承
<dependencyManagement>
    <dependencies>
        <!-- 子 pom 可以继承 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <!-- 子 pom 不可以继承 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <optional>true</optional><!--子 pom 无论如何都不能继承-->
        </dependency>
    </dependencies>
</dependencyManagement>
(3)子项目配置父项目
<parent>
        <!-- 父项目坐标 -->
        <artifactId>parent</artifactId>
        <groupId>com.ictpaas</groupId>
        <version>1.0-SNAPSHOT</version>
        <!-- 父项目 pom 文件路径-->
        <relativePath>../parent/pom.xml</relativePath>
    </parent>
(4) 子项目依赖配置
<dependencies>
        <!-- 不需要版本, 会从父项目继承, 如果指定版本就是代表不是来自父 pom 而是子 pom 自己的. 父项目的 log4j 是不能继承的 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
    </dependencies>

5) 子项目不仅仅继承依赖, url, name, modeVersion等也能继承, 换句话说子 pom 文件内容很少, 看起来很简洁, 下面贴出完整的父子 pom 文件

完整的父子 pom 文件:

父 pom:

<?xml version="1.0" encoding="UTF-8"?>

<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>com.ictpaas</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>parent Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <optional>true</optional>
        </dependency>
    </dependencies>
</dependencyManagement>

    <build>
        <finalName>parent</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.7.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.20.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

子 pom

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <!-- 父项目坐标 -->
        <artifactId>parent</artifactId>
        <groupId>com.ictpaas</groupId>
        <version>1.0-SNAPSHOT</version>
        <!-- 父项目 pom 文件路径-->
        <relativePath>../parent/pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>child01</artifactId>

    <dependencies>
        <!-- 不需要版本, 会从父项目继承 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
    </dependencies>

</project>

六. Maven的WEB项目

  • pom文件
<?xml version="1.0" encoding="UTF-8"?>

<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>com.yue</groupId>
  <artifactId>maven04-web</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>maven04-web Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>13</maven.compiler.source>
    <maven.compiler.target>13</maven.compiler.target>
  </properties>

  <dependencies>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1-b06</version>
      <scope>provided</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope><!--测试和编译期间起作用-->
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>maven04-web</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

缺少啥jar包就去网站复制

  • servlet文件
package com.yue.web;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "IndexServlet", value = "/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(Math.random());
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
    }
}

  • jsp文件
<html>
<body>
<h2>Hello World!</h2>
${pageContext.request.contextPath}
<%=request%>
</body>
</html>

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月色夜雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值