Maven项目管理工具详解

1、Maven是什么

  • 首先在了解Maven之前,我们可以发现之前的Web项目,使用到了很多的jar包,比如数据库连接的、第三方工具类等,这都需要我们自己手动下载好对应的jar包之后,放在项目下的lib目录中,并手动依赖;这些工作难度不大,但是非常琐碎且耗时。如果每一个项目都自己搞一套配置,并且经常需要维护升级,肯定会一团糟。我们需要的是一个标准化的Java项目管理和构建工具。
  • maven 翻译为"专家",“内行”,是Apache下的一个纯 java 开发的开源项目,它是一个项目管理工具,使用 maven 对 Java 项目进行构建、依赖管理 当前使用 maven 的项目在持续增长。

项目构建

  • 什么是项目构建:

项目构建是一个项目从编写源代码到编译、测试、运行、打包、部署、运行的过程;

  • 传统项目构建过程

传统的使用IDEA构建项目的过程如下:

在这里插入图片描述

  • 构建过程如下:

1)在IDEA中创建一个java web工程
2)在工程中编写源代码及配置文件等
3)对源代码进行编译,java文件编译成class文件
4)执行Junit单元测试
5)将工程打成war包部署至tomcat运行

  • maven项目构建过程:

maven 将项目构建的过程进行标准化,每个阶段使用一个命令完成,下图展示了构建过程的一些阶段,后面章节详细介绍每个阶段,这里先大概了解下:

在这里插入图片描述

上图中部分阶段对应命令如下:

清理阶段对应maven的命令是clean,清理输出的class文件
编译阶段对应maven的命令是compile,将java代码编译成class文件。
打包阶段对应maven的命令是package,java工程可以打成jar包,web工程可以打成war包

  • 运行一个maven工程(web工程)需要一个命令:tomat:run

  • maven工程构建的优点:

1、一个命令完成构建、运行,方便快捷。
2、maven对每个构建阶段进行规范,非常有利于大型团队协作开发。

依赖管理

  • 什么是依赖管理:

一个java项目可能要使用一些第三方的jar包才可以运行,那么我们说这个java项目依赖了这些第三方的jar包。

举个例子:一个crm系统,它的架构是SSH框架,该crm项目依赖SSH框架,具体它依赖的Hibernate、Spring、Struts2

依赖管理就是对项目所有依赖的jar包进行规范化管理;

  • 传统项目的依赖管理

传统的项目工程要管理所依赖的jar包完全靠人工进行,程序员从网上下载jar包添加到项目工程中,如下图:程序员手工将Hibernate、struts2、spring的jar添加到工程中的WEB-INF/lib目录下。

在这里插入图片描述

手工拷贝jar包添加到工程中的问题是:
1、没有对jar包的版本统一管理,容易导致版本冲突。
2、从网上找jar包非常不方便,有些jar找不到。
3、jar包添加到工程中导致工程过大。

  • maven项目的依赖管理

maven项目管理所依赖的jar包不需要手动向工程添加jar包,只需要在pom.xml(maven工程的配置文件)添加jar包的坐标,自动从maven仓库中下载 jar包、运行,如下图:

在这里插入图片描述

使用maven依赖管理添加jar的好处:
1、通过pom.xml文件对 jar包 的版本进行统一管理,可避免版本冲突。
2、maven团队维护了一个非常全的maven仓库,里边包括了当前使用的jar包,maven工程可以自动从maven仓库下载 jar包,非常方便。

使用maven的好处

  • 通过上边介绍传统项目和maven项目在项目构建及依赖管理方面的区域,maven有如下的好处:

1、一步构建:maven对项目构建的过程进行标准化,通过一个命令即可完成构建过程。
2、依赖管理:maven工程不用手动导jar包,通过在pom.xml中定义坐标从maven仓库自动下载,方便且不易出错。
3、maven的跨平台,可在window、linux上使用。
4、maven遵循规范开发有利于提高大型团队的开发效率,降低项目的维护成本,大公司都会考虑使用maven来构建项目。

2、Maven的下载以及Maven仓库的使用

Maven 官网:maven.apache.org

在这里插入图片描述

  • Maven文档

Maven 3.6.3版本文档:http://maven.apache.org/ref/3.6.3/

  • Maven下载好之后,安装解压即可,下面是解压之后的一些文件夹:

在这里插入图片描述

  • 配置Maven:

在环境变量中新建变量名MAVEN_HOME值为Maven的安装路径,然后在PATH中引用你的MAVAEN_HOME如下图:

在这里插入图片描述

  • 查看是否配置成功,可在黑窗口中输入mvn –v,出现如下图所示说明配置成功,如果有时出现不是本地命令,可以用管理员身份打开黑窗口;

在这里插入图片描述

maven仓库

  • maven的工作需要从仓库下载一些jar包,如下图所示,本地的项目A、项目B等都会通过maven软件从远程仓库(可以理解为互联网上的仓库)下载jar包并存在本地仓库本地仓库就是本地文件夹,当第二次需要此jar包时则不再从远程仓库下载,因为本地仓库已经存在了,可以将本地仓库理解为缓存,有了本地仓库就不用每次从远程仓库下载了。

  • 下图描述了maven中仓库的类型:

在这里插入图片描述

  • 本地仓库 :用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找,默认本地仓库位置在${user.dir}/.m2/repository${user.dir}表示windows用户目录

在这里插入图片描述

  • 远程仓库:如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网内。

  • 中央仓库 :在maven软件中内置一个远程仓库地址http://repo1.maven.org/maven2,它是中央仓库,服务于整个互联网,它是由Maven团队自己维护,里面存储了非常全的jar包,它包含了世界上大部分流行的开源项目构件。

  • 配置本地仓库

1、在任意盘符下新建一个目录作为仓库;
2、然后在Maven的安装目录下找到conf目录下的settings.xml配置文件,打开此文件配置本地仓库的路径;
3、本地仓库目录建好后 打开settings.xml文件进行配置本地仓库<localRepository>D:\my_maven_local_repository</localRepository>

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

配置阿里云的私服

  • 有时候发现从中央仓库下载jar包,速度有些慢,这时候我们可以在Maven安装目录下的settings.xml文件中配置这样的代码:
  • 也就是说再次去下载jar包的时候,会找到阿里云的私服然后下载,这样速度会很快;
  • 这个私服中收藏了大量的第三方jar包,几乎能满足我们开发的需求;
 <mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
	 <!-- 配置阿里云的私服下载jar包更快 -->
<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
  </mirrors>

3、Maven常用命令

  • 注意:运行maven命令的时候,首先需要定位到maven项目的目录,也就是项目的pom.xml文件所在的目录。否则,必以通过参数来指定项目的目录。
命令含义
mvn –version显示版本信息
mvn clean清理项目生产的临时文件,一般是模块下的target目录
mvn compile编译源代码,一般编译模块下的src/main/java目录
mvn package项目打包工具,会在模块下的target目录生成jar或war等文件
mvn test测试命令,或执行src/test/java/下junit的测试用例
mvn install将打包的jar/war文件复制到你的本地仓库中,供其他模块使用
mvn deploy将打包的文件发布到远程参考,提供其他人员进行下载依赖
mvn site生成项目相关信息的网站
mvn eclipse:eclipse将项目转化为Eclipse项目
mvn dependency:tree打印出项目的整个依赖树
mvn archetype:generate创建Maven的普通java项目
mvn tomcat:run在tomcat容器中运行web应用 需要插件支持
mvn jetty:run调用 Jetty 插件的 Run 目标在 Jetty Servlet 容器中启动 web 应用
  • 执行Maven命令:

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

以上是我们在控制台中输入命令来构建Maven项目,那后面我们都是会在软件中采用图形界面化的方式来运行Maven命令,比如我们的IDEA帮我们集成好了Maven项目的管理模块,那我们就可以使用IDEA来操作Maven项目了;

Maven命令详解:

compile

compile是maven工程的编译命令,作用是将src/main/java下的文件编译为class文件输出到target目录下。cmd进入命令状态,执行mvn compile,如下图提示成功:

在这里插入图片描述

查看 target目录,class文件已生成,编译完成。

在这里插入图片描述

test

test是maven工程的测试命令,会执行src/test/java下的单元测试类。 cmd执行mvn test执行src/test/java下单元测试类;

clean

clean是maven工程的清理命令,执行 clean会删除target目录的内容。

package

package是maven工程的打包命令,对于java工程执行package打成jar包,对于web工程打成war包。

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

install是maven工程的安装命令,执行install将maven打成jar包或war包发布到本地仓库。

  • 从运行结果中,可以看出:当后面的命令执行时,前面的操作过程也都会自动执行;

4、Maven的生命周期

  • 三套生命周期

maven对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

1、Clean Lifecycle在进行真正的构建之前进行一些清理工作。
2、Default Lifecycle构建的核心部分,编译,测试,打包,部署等等。
3、Site Lifecycle生成项目报告,站点,发布站点。
在这里插入图片描述

5、Maven项目工程目录约定

  • 使用maven创建的工程我们称它为maven工程maven工程具有一定的目录规范,如下:
src/main/java —— 存放项目的.java文件
src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件
src/test/java —— 存放所有单元测试.java文件,如JUnit测试类
src/test/resources —— 测试资源文件
target —— 项目输出位置,编译后的class文件会输出到此目录
pom.xml——maven项目核心配置文件
Project
  |-src
  |   |-main
  |   |  |-java        —— 存放项目的.java文件
  |   |  |-resources   —— 存放项目资源文件,如spring, hibernate配置文件
         |-webapp     —— webapp目录是web工程的主目录
            |-WEB-INF
              |-web.xml
  |   |-test
  |      |-java        ——存放所有测试.java文件,如JUnit测试类
  |      |-resources   —— 测试资源文件
  |-target             —— 目标文件输出位置例如.class.jar、.war文件
  |-pom.xml           —— maven项目核心配置文件
  • Maven工程的目录结构必须遵循上面的结构,我们可以手动去创建Maven的目录结构,当然我们一般是通过软件帮我们创建的,不管是软件创建,还是手动创建,都必须遵循Maven的目录结构;

  • 如图所示 IDEA 创建出来的Maven项目结构如下:

在这里插入图片描述

6、pom.xml文件

  • 一个maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等。
  • 依赖管理系统(Dependency Management System),通过maven的依赖管理对项目所依赖的jar包进行统一管理。

比如:项目依赖junit4.9,通过在pom.xml中定义junit4.9的依赖即使用junit4.9,如下所示是junit4.9的依赖定义:

<!-- 依赖关系 -->
	<dependencies>
		<!-- 此项目运行使用junit,所以此项目依赖junit -->
		<dependency>
			<!-- junit的项目名称 -->
			<groupId>junit</groupId>
			<!-- junit的模块名称 -->
			<artifactId>junit</artifactId>
			<!-- junit版本 -->
			<version>4.9</version>
			<!-- 依赖范围:单元测试时使用junit -->
			<scope>test</scope>
		</dependency>
	</dependencies>
  • 一个项目生命周期(Project Lifecycle)

使用maven完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven将这些过程规范为一个生命周期,如下所示是生命周期的各各阶段:

在这里插入图片描述

maven通过执行一些简单命令即可实现上边生命周期的各各过程,比如执行mvn compile执行编译、执行mvn clean执行清理。

  • 一组标准集合

maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等

  • 插件(plugin)目标(goal)

maven 管理项目生命周期过程都是基于插件完成的。

  • 定义maven坐标

每个maven工程都需要定义本工程的坐标,坐标是maven对jar包的身份定义,比如,入门程序的坐标定义如下:

<!--项目名称,定义为组织名+项目名,类似包名-->
<groupId>org.westos</groupId>
<!-- 模块名称 -->
<artifactId>maven-first</artifactId>
<!-- 当前项目版本号,snapshot为快照版本即非正式版本,release为正式发布版本 -->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包类型
	jar:执行package会打成jar包
	war:执行package会打成war包
	pom :用于maven工程的继承,通常父工程设置为pom

在这里插入图片描述

7、使用IDEA创建Maven项目

  • 1、首先在IDEA中配置Maven:

Settings——>Maven——>进行以下配置:
在这里插入图片描述
在这里插入图片描述

  • 2、使用IDEA创建一个Maven项目:

File-New-Project 弹出如下窗口 –选择Maven项目:
在这里插入图片描述
继续下一步:
在这里插入图片描述
继续下一步:
在这里插入图片描述
继续下一步:
在这里插入图片描述

【注意】:如果是第一次创建该项目,Maven需要联网下载一些插件,花费一定的时间;

  • 3、补全Maven项目的目录结构:

最开始创建的Maven项目目录结构不完整,我们需要手动添加一些文件夹;注意层次结构以及文件夹的名称要正确;

创建好文件夹之后还需要改变他们的类型,不然用不了;

在这里插入图片描述

至此我们的Maven目录结构就设置好了

在这里插入图片描述

  • 设置目录的另外两种方式:

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

8、IDEA对Maven项目的管理

  • 一般 Maven 的项目我们都可以脱离IntelliJ IDEA的项目配置功能进行独立的管理和构建的,但我们任然可以通过 IntelliJ IDEA 提供的Maven 管理工具进行项目的管理和构建;

  • 首先看下IDEA中关于Maven提供的工具怎么使用:

在这里插入图片描述

  • 管理和创建Maven项目的按钮的含义:

在这里插入图片描述

  • 最开始如果我们在Maven管理的Web项目下创建一个Servlet,会发现直接报错,这是因为Servlet找不到API;

在这里插入图片描述
我们需要在pom.xml配置文件中通过jar包的坐标,去仓库中依赖项目所需要的jar包;

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

  • 如何搜索我们需要的jar包:http://mvnrepository.com/

在这里插入图片描述

  • 还有一种方式搜索本地仓库的jar包自动添加jar包坐标,在你的pom.xml文件中 按alt+insert快捷键弹出一个框:

在这里插入图片描述

有时候可能提示出来的jar包不全,可以更新一下本地仓库,因为有时你刚从远程仓库下载到本地仓库的jar包,没有提示出来

在这里插入图片描述

9、发布项目

使用tomcat插件发布项目

  • 步骤:首先配置pom.xml文件,在<plugins>标签内部配置一个tomcat插件,
<!-- 配置Tomcat插件 -->
<plugin>
  <groupId>org.apache.tomcat.maven</groupId>
  <artifactId>tomcat7-maven-plugin</artifactId>
  <version>2.2</version>

<configuration>
  <!--端口控制-->
  <port>8080</port>
  <!--项目路径控制意味着http://localhost:8080/abc-->
  <path>/abc</path>
  <!--编码-->
  <uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
  • 然后再添加我们的Maven项目:

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

  • 最后启动项目:

在这里插入图片描述

  • 注意在发布项目之前检查你的pom.xml中第三方jar包的坐标;

后台代码:

@WebServlet(name = "ServletDemo1", value = "/demo1")
public class ServletDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("进来了");
    }

pom.xml文件

<?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>org.westos</groupId>
  <artifactId>myMavenDemo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>myMavenDemo 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>

  <dependencies>
    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/taglibs/standard -->
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>myMavenDemo</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>

          <configuration>
            <!--端口控制-->
            <port>8080</port>
            <!--项目路径控制意味着http://localhost:8080/abc-->
            <path>/abc</path>
            <!--编码-->
            <uriEncoding>UTF-8</uriEncoding>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

最终结果

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

使用传统方式发布项目

  • 和之前发布的web项目一样,使用传统的发布项目的方式的时候,依然是配置本地的tomcat,

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

10、jar包依赖范围的介绍

  • 添加jar包的坐标时,还可以指定这个jar包将来的作用范围:

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

©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页