Maven基础

该文档是:Maven基础学习...

博客连接:https://www.loveuluo.cn

日期:2020-12-30

1. Maven简介

1.1 软件是一个工程

image-20201230183137973

1.2 传统开发项目的问题

image-20201230183128180

1.3 Maven概述

image-20201230183047158

1.4 项目的构建

image-20201230183117563

1.5 maven核心概念

image-20201230183207355

1.6 maven工具的安装和配置

image-20201230183228149

2. Maven的核心概念

2.1 Maven工程约定目录结构

image-20201230183329594

2.2 第一个maven工程

image-20201230183636195

image-20201230183659919

2.3 仓库

2.3.1 仓库的概念

image-20201230184023845

2.3.2 仓库存什么

image-20201230184043019

2.3.3 仓库的类别

image-20201230184102119

2.3.4 Maven 对仓库的使用

image-20201230184115619

2.4 POM 文件

概述:

image-20201230183800124

2.5 Maven的生命周期(重要)

2.5.1 什么是生命周期

maven的生命周期:就是maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署

img

Maven 强大的原因是有一个十分完善的生命周期,生命周期可以理解为项目构建步骤的集合,它定义了各个构建环节的执行顺序,有了这个顺序,Maven 就可以自动化的执行构建命令。

Maven 的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。有三套相互独立的生命周期,各个构建环节执行顺序不能打乱,必须按照既定的正确顺序来执行。

①、Clean Lifecycle:在进行真正的构建之前进行一些清理工作

②、Default Lifecycle:构建的核心部分,编译、测试、打包、安装、部署等等。

③、Site Lifecycle:生成项目报告,站点,发布站点。

这三个都是相互独立的。你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。当然,也可以直接运行 mvn claen install site 运行所有这三套生命周期。下面我们分别来谈谈这三个生命周期。

清理生命周期(Clean Lifecycle):

每套生命周期都由一组阶段(Phase)来组成,我们平时在控制台输入的命令总是会对应于一个特定的阶段,比如运行mvn clean,这里的clean就是清理生命周期的一个阶段。

清理生命周期一共包含了三个阶段:

1.pre-clean(预清理):执行一些需要在clean阶段之前完成的工作。

2.clean(清理):移除所有上一次构建生成的文件。

3.post-clean(后清理):执行一些需要在clean结算之后立刻完成的工作。

mvn clean中的clean就是上面的clean。在一个生命周期中运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean就相当于mvn pre-clean clean。如果我们运行mvn post-clean,那么pre-clean和clean都会被运行。这是Maven的一个很重要的规则/特性,可以大大地简化命令的输入。

默认生命周期(Default Lifecycle)

默认生命周期是Maven最重要的一个生命周期,绝大部分工作都发生在这个生命周期中。

默认生命周期包含了以下的阶段(这里只列出常用和必要了解的,实际上还有很多):

process-resources:复制并处理资源文件,至目标目录,准备打包。

compile:编译项目的源代码。

process-test-resources:复制并处理资源文件,至目标测试目录。

test-compile:编译测试源代码。

test:使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。

package:接受编译好的代码,打包成可发布的格式,如 JAR 。

install:将包安装至本地仓库,以让其它项目依赖。

deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

其实默认生命周期中还提供了很多的阶段,但是因为实际上会经常使用到的也就只有complie、test、package、install和deploy五个阶段,这里也就不全部列出来了。想要了解所有的阶段的话,可以到Maven的官方网站中查阅:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

基本上,根据名称我们就能猜出每个阶段的用途。

站点生命周期(Site Lifecycle)

站点生命周期存在以下四个阶段:

1.pre-site(预站点):执行一些需要在生成站点文档之前的工作。

2.site(站点):生成项目的站点文档。

3.post-site(后站点):执行一些需要在生成站点文档之后完成的工作,并且为部署做准备。

4.site-deploy(站点部署):将生成的站点文档部署到特定的服务器上。

在这些阶段中,最常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点。这是Maven提供的一个相当强大的功能之一,深得管理者喜爱,因为文档和统计数据能够自动生成,并且很好看。

Maven生命周期的总结

Maven的生命周期的知识点比较简单,在使用上只要记住,在同一套生命周期中运行任何一个阶段的时候,它前面的所有阶段都会被执行就行了。这就是为什么当我们运行mvn install命令的时候,代码会被编译(compile)、测试(test)和打包(package)。

但是这一特性在不同一套的生命周期中并不适用,比如很容易会认为清理生命周期是在默认生命周期之前的必经阶段。也就是说,会被认为如果执行默认生命周期中的阶段的话,清理生命周期中的所有阶段都会被执行。而这是不对的,不同一套的生命周期之间是相互独立的,其中的阶段并不会相互影响。如果需要在打包之前先清理之前打包的内容,需要单独运行清理生命周期。当然了,一般也会建议这么做,否则可能出现一些打包的奇怪问题,比如有一些文件并没有被更新的问题。

另外需要注意的是,这些对项目及进行编译、测试、打包、运行、部署等工作在Maven中都是抽象的定义,Maven自身是不会实际负责这些工作的,而是交由插件来实现。意思就是说,Maven命令的实际工作执行者是各种各样的插件,通过插件提供的命令与Maven提供的阶段相互绑定来完成相应的工作。因此Maven的插件机制是完全依赖于Maven的生命周期的,要想运用好这些Maven命令插件,理解Maven的生命周期也就变得十分重要。

img

上面这张图是Idea开发工具中的Maven插件,只要理解了Maven的生命周期和其中的阶段,就能很好地使用这个插件了。

2.5.2 Maven的常用命令

**maven独立使用,通过命令,完成maven的生命周期的执行。
maven可以使用命令,完成项目的清理,编译,测试等等**

image-20201230190806543d

2.5.3 Maven的插件

插件(plugin),每个插件都能实现一个阶段的功能。Maven的核心是生命周期,但是生命周期相当于主要指定了maven命令执行的流程顺序,而没有真正实现流程的功能,功能是有插件来实现的。比如,compile就是一个插件实现的功能。

image-20201230191106790

clean 插件 maven-clean-plugin:2.5

clean 阶段是独立的一个阶段,功能就是清除工程目前下的 target 目录。

resources 插件 maven-resources-plugin:2.6

resource 插件的功能就是把项目需要的配置文件拷贝到指定的目当,默认是拷贝 srcmainresources 目录下的件到classes 目录下。

compile 插件 maven-compiler-plugin

compile 插件执行时先调用 resouces 插件,功能就是把 srcmainjava 源码编译成字节码生成 class 文件,并把编译好的 class 文件输出到 targetclasses 目录下。

test 测试插件

单元测试所用的 compile 和 resources 插件和主代码是相同的,但执行的目标不行,目标 testCompile 和 testResources是把 srctestjava 下的代码编译成字节码输出到 targettest-classes,同时把 srctestresources 下的配置文件拷贝到targettest-classes。

package 打包插件 maven-jar-plugin

这个插件是把 class 文件、配置文件打成一个 jar(war 或其它格式)包。

deploy 发布插件 maven-install-plugin

发布插件的功能就是把构建好的 artifact 部署到本地仓库,还有一个 deploy 插件是将构建好的 artifact 部署到远程仓库。

2.5.4 Maven的插件之常用插件

插件可以在自己的项目中设置,最常使用的是 maven 编译插件。设置项目使用的 jdk 版本时通过编译插件指定。
pom.xml 文件<build>中设置。

1.编译插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
           </configuration>
       </plugin>
   </plugins>
</build>

表示使用jdk_1.8。【修改后更新项目】

2.tomcat插件

(1).基本应用

默认输入tomcat:run命令去使用tomcat插件来启动web工程,但是默认的tomcat插件使用的tomcat版本是tomcat6。如果想更改,需要手动配置tomcat插件:

<plugin>
       <!-- 配置插件 -->
       <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <configuration>
            <port>8080</port>
       <path>/</path>
      </configuration>
</plugin>

使用tomcat7来运行web工程,它的命令是:tomcat7:run(不是tomcat:run,否则path无效)

注意:path中的/表示当前web项目,故在访问的时候不需要输入项目名称(也就是该插件只能同时运行一个web项目),如当前web项目为maven,那么在访问webapp下面的index.jsp时只需要http://localhost:8080/index.jsp

附加,常见命令:

命令描述
tomcat:deploy部署一个web项目
tomcat:reload重新加载web项目
tomcat:start启动Tomcat服务器
tomcat:stop关闭Tomcat服务器
tomcat:undeploy停止项目
tomcat:run启动嵌入式Tomcat

(2).发布到远程tomcat

使用 tomcat内部manager 程序,进行项目热部署 (需要远程tomcat 必须开启的 ),首先在 tomcat/conf/tomcat-user.xml 建立账号:

<!--图形化界面访问用户-->
<user username="shen" password="123456" roles="admin-gui,manager-gui" />

<!--远程服务器访问-->
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="123456" roles="manager-gui, manager-script"/>

tomcat6如下:

<role rolename="manager"/>
<user username="tomcat" password="123456" roles="manager"/> 

tomcat7如下:

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="123456" roles="manager-gui, manager-script"/>

然后配置pom.xml 允许远程发布:

<!-- 使用 plugin 配置tomcat-maven-plugin -->
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>tomcat-maven-plugin</artifactId>
    <version>1.1</version>
    <!-- 对插件进行配置 -->
    <configuration>
        <!-- 内嵌插件 端口 -->
        <port>80</port>
        <!-- 远程发布  -->
        <url>http://localhost:8080/manager/text</url>  
        <server>myserver</server>
    </configuration>
  </plugin>

tomcat6如下:

<url>http://localhost:8080/manager</url>

tomcat7如下:

<url>http://localhost:8080/manager/text</url> 
<server>myserver</server>

然后配置 setting.xml 服务器myserver 连接属性如下:

<server>
     <id>myserver</id>
     <username>tomcat</username>
     <password>123456</password>
</server>

保证外部tomcat 正确运行后,执行 tomcat:deploy【打开】 / tomcat:redeploy 【关闭】,将会把当前项目发布到该远程tomcat服务器上。

2.6 坐标(gav)

image-20201230191428165

2.7 依赖(dependency)

image-20201230191441760

2.8 单元测试

image-20201230193802032

image-20201230193809774

3. Maven在IDEA中的应用(重要)

3.1 IDEA集成Maven

设置Maven:

image-20201230201728456

image-20201230192546277

设置Runner

image-20201230192905025

3.2 IDEA创建Maven版java工程

创建 maven 版 java 工程

File-->New-->Module…:

image-20201230205622076

填写 maven 工程的坐标

image-20201230205829557

填写工程名和存储路径

image-20201230210004279

当我们新建maven项目后,右下角都会有弹框提示

Import Changes Enable Auto-Import:导入我们新添加的依赖

Enable Auto-Import:以后更改 .pom 文件后自动下载依赖包

这里我们选择Enable Auto-Import。

image-20201230202752133

pom.xml 加入依赖

image-20201230210331758

这些是插件,是idea方便你去配置他们,把他们都给你列出来了,如果你不需要配置他们,整个build都可以不要。你写上不写上他们其实都有,给你列出来了目的是为了方便配置他们的参数。

image-20201230210806818

创建后的视图

image-20201230210942515

image-20201230212521874

测试一下是否能运行

image-20201230211301169

输出一条语句,测试项目构建成功。

3.3 IDEA创建Maven版web工程

3.3.1 创建 Maven版web工程

File-->New-->Module…:

image-20201230221531526

填写 maven 工程的坐标

image-20201230221705278

设置所使用的 maven

之前如果设置过Other Setting就会自动有。

image-20201230221852397

填写 maven 工程名称和存储路径

image-20201230222024715

当控制台出现” BUILD SUCCESS”时,表示工程创建完成。

创建后视图

image-20201230222320598

显然,按照 maven archetype 原型创建的 maven web 工程缺少 maven 项目的完整结构:src-main-java / resources,src-test-java/resources,所以需要我们手动添加文件目录。

创建缺省文件夹

src-main-java / resources,src-test-java/resources

image-20201230222613341

把文件夹标识为源码文件夹

File -> Project Structure, 选择Modules:右边找到java这层机构,在上面有个“Mask as”, 点下Sources,表示这里面是源代码类。

image-20201230222830064

pom.xml 添加依赖

别的都和java工程中相同。

image-20201230223418755

3.3.2 如何配置本地tomcat

然后编写测试类 HelloWorld 和测试页面 index.jsp

做法和平时JavaWeb没有区别,这里只讲如何配置本地tomcat。

1.在主页面打开ProjectStructure, File -->Project Struture 添加web选项,表明是一个web项目.

image-20201230224613860

2.打开ProjectStructure后,按照图示依次点击Facets->+号,在弹出的对话框个中选择Web.

image-20201230224716783

3.在弹出的对话框选择刚才创建的Maven项目,点击ok.

image-20201230224743990

4.这里 点击Create artifact,创建web项目导出配置

image-20201230224816863

5.点击Create artifact后,会自动跳到Artifacts标签。

image-20201230224916369

6.选中Modules标签,点击+号,添加一个文件路径,指向你项目的webapp目录,点击ok

image-20201230225304826

7.点击ok

image-20201230225345258

8.给项目添加Tomcat 服务器 run --> Edit Configurtions...

image-20201230225717705

9.点击+号,选择Tomcat Server --> Local

image-20201230225804154

10.选中Server选项卡,Name这里可以写tomcat的名字,也可以不改,使用默认的。端口号默认是8080,根据自身需要是否更改,这里我未做更改。

image-20201230225936935

11.选中Deployment选项卡,点击+号,点击Artifact,最后点击ok,完成。

image-20201230230041851

12.启动Tomcat

image-20201230230322318

13.浏览器输入 localhost:8080

image-20201230230358301

3.4 IDEA中导入Maven工程(module)

新建一个空的 project 作为工作空间

在项目结构中导入或移除 module

File-->Project Structure…

image-20201231084005154

选择要导入的 Module:

image-20201231084013216

选择导入方式

image-20201231084023737

选择要导入的项目

image-20201231084033452

选择要导入的 maven 工程

image-20201231084040846

没设置jdk,此处需要配置,已配置,略过这步

image-20201231084059547

或者在Project Structure中选择一下

image-20201231084631917

导入后项目结构

image-20201231084106416

导入后视图

image-20201231084117048

3.5 Maven小技巧

如果发现Maven pom文件依赖有问题爆红(idea没有立刻识别出来),可以尝试一下刷新

这是刷新对应pom的项目。

image-20201231084416598

这是刷新所有项目。

image-20201231084457621

4. 依赖管理

image-20201231085258017

image-20201231085414506

5. Maven常用设置

5.1 全局变量

在 Maven 的 pom.xml 文件中,<properties>用于定义全局变量,POM 中通过${property_name}的形式引用变量的值。

定义全局变量(名字随便起):

image-20201231085916004

引用全局变量(和上边的名字要相同):

image-20201231085931234

Maven 系统采用的变量(系统自带,名字不能自己起得和下边相同):

image-20201231085944173

5.2 指定资源位置插件

作用: mybatis课程中会用到这个作用

image-20201231090243882

1.默认没有使用resources的时候, maven执行编译代码时, 会把src/main/resource目录中的文件拷贝到target/classes目录中。对于src/main/java目录下的非java文件不处理,不拷贝到target/classes目录中。

2.我们的程序有需要把一些文件放在src/main/java目录中,当我们在执行java程序时,需要用到src/main/java目录中的文件。需要告诉maven在mvn compile src/main/java目录下的程序时,需要把文件一同拷贝到target/classes目录中。(此时就需要在<build>中加入<resources>

最后修改:2020 年 12 月 31 日 09 : 18 AM
如果觉得我的文章对你有用,请随意赞赏