Maven入门

Maven入门

威哥教育QQ群:673215016

威哥教育官网:http://www.vgxit.com

哔哩哔哩首页:https://space.bilibili.com/505541423

腾讯课堂首页:https://ruanqi.ke.qq.com/?tuin=cdc1dc7d

本博客对应视频教程:http://vgxit.com/course/18


目录

Maven入门

1,提出问题

2,什么是Maven

3,依赖管理

4,构建

5,安装Maven

6,idea集成Maven插件

7,使用骨架在idea工具来创建一个Java的Maven工程

8,manven标准目录结构:

9,仓库

10,Maven命令的基本使用

11,Maven生命周期

12,不使用骨架如何在idea中创建一个java工程

13,使用骨架如何在idea中创建一个JavaWeb工程

14,在Maven创建Web工程下编写小案例

15,maven插件方式部署Web项目

16,scope的作用



1,提出问题

我们之前在开发和学习的时候,我们用到了很多第三方的包,比如说Json转换的包Jackson,比如我们数据库连接池的包Druid等等。我们现有的方式是把Jar包复制粘贴到项目中,然后设置为library来实现。但是这样会有一些问题。比如我们要去找到这些包,下载好,本来就非常的麻烦。并且如果我们以后用到更多的第三方包,这些第三方包又依赖于其他的第三方包,其他的第三方包还依赖于更多的第三方包。我们要解决这些第三方依赖包,工作量是非常大的。

并且各个第三方项目依赖同一个包,但是版本不同,这个时候,会给我们造成很大的麻烦。老师大概在10年之前接触到java时候,那个时候,我们引入包的方式就是复制粘贴,非常麻烦,向当时我们还流行ssh开发,当时我初学的时候,把ssh三大框架通过自己下载复制粘贴包来整合好差不多花了我3到4天的时间,非常的麻烦。但是有的同学会告诉老师,我已经学了这么多课程了,我觉得第三方的依赖包很好解决啊。这里老师告诉一下大家,这个是因为你现在用到的第三方jar包还不够多,向我们线上项目,一个项目依赖几百个jar包都是属于正常现象。


2,什么是Maven

Maven是一个项目管理工具,它包含了一个项目对象模型(POM),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

读了这段话,大家有没有感觉?好像没什么感觉。

我们接下来给大家介绍一下Maven到底可以解决什么问题:

  • 我们需要引入各种jar包,尤其是比较大的工程,引入jar包往往有几十个甚至是几百个,没用到一个jar包,都需要手动引入工程,而且经常遇到各种让人抓狂的jar包冲突问题。
  • 我们辛辛苦苦写好了Java文件,电脑是完全读不懂我们的Java文件,它需要变异成二进制字节码。现在这项工作可以由一些开发工具帮我们完成(Eclipse,Idea)。这个时候Maven就提供了一键编译整个项目的功能。
  • 我们写的程序,只要是程序就一定会有bug。因此我们写完了代码之后,还需要做测试,而我们用单元测试(Junit)来测试bug是一个常用的手段。但是如果我们一个一个文件的去手动跑单元测试也是非常麻烦的。Maven可以帮助我们一键自动化测试,然后生成测试报告。
  • 我们写好了代码之后,我们还需要把代码和各种配置文件一起,定型,打包,如果是一个Web项目,我们还需要发布到服务器,提供给用户使用。而Maven就为我们提供好了自动化发布Web项目的功能。

同学们想一想,Maven这么好,这么优秀,那我们为什么不学习,不用呢?


3,依赖管理

这里老师在网上找了两张图,这是一个网友写的同一个项目,crm目录表示没有引入maven时候的项目大小,maven表示使用了maven之后的大小

为什么引入了Maven和没有引入Maven的项目差别这么大,因为我们再传统的JavaWeb项目中,我们引入的第三方的jar包存放的目录在lib目录。但是我们用Maven开发的项目,我们的jar包是存放在maven的jar包仓库当中的。如下图:

通过上面我相信同学们对依赖管理已经有一个模糊的认识,其实用大白话来说就是maven工程对jar包的管理过程。我们在代码中,无须真实的引入jar包,我们只需要编写jar包对应的坐标,我们要使用的时候,maven会根据jar包的坐标找到jar包仓库中真实的地址。


4,构建

我们的项目,往往需要经历编译,测试,运行,打包,安装,部署等一系列过程。 那么什么是构建呢?就是项目从编译,测试,运行,打包,安装,整个过程都是交个maven进行管理,这个过程成为构建。 而一键构建,就是指整个构建过程,使用maven一个命令就可以轻松的完成工作。 maven构建的流程如下:

以上的整个过程,我们可以通过一个maven命令全部搞定。


5,安装Maven

1, 首先要下载Maven,Maven下载地址: https://mirror-hk.koddos.net/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip

2, 解压刚刚下载下来的安装包,我们可以发现有如下几个目录:

  • bin目录:maven运行的命令,这里面有一个我们之后会经常使用到命令,mvn
  • boot目录:boot目录里面存放了maven自身运行需要用到的类加载器
  • conf目录:maven配置文件存放的目录 lib目录:
  • maven依赖的jar包

3, 设置MAVEN_HOME环境变量为我们的安装目录。

4, 将Maven的bin目录设置到Path环境变量下。

5,验证安装,我们打开cmd,输入一个mvn -v命令来看看是否安装好了:


6,idea集成Maven插件

1,首先保证我们的账号电脑上已经安装了maven工具

2,点击File->settings。然后找打maven。

3,配置maven的安装目录和settings文件:

4,在Runner上配置如下参数:

-DarchetypeCatalog=internal

这个配置的作用:每次创建项目的时候。IDEA都要用插件来进行创建,这些插件当你创建新项目的时候,它每次都会去中央仓库下载,这样就使得我们的创建比较慢。应该是在创建的时候,让它本地仓库中的插件进行创建项目。

到此为止,Maven整合Idea已经全部完成。


7,使用骨架在idea工具来创建一个Java的Maven工程

1,创建一个Module,在左侧选择是Maven类型的:

在上面的右侧,maven给我们已经提供好了很多骨架,一定要技术使用这些骨架的时候,你的电脑必须要联网。或者是我们之前已经创建过了对应的骨架的项目(创建过了一次,maven就会自动下载这些骨架到你的本地硬盘)。

如果需要使用骨架需要选择上面的create from archetype。

2,我们选中quickstart的骨架。

 

3,点开下面区域,我们我们maven工程坐标:

groupId:就是你的jar包的组织架构,一般情况下,我们直接用我们公司的域名的倒序就OK了。比如V哥讲课,就直接使用com.vgxit就好了。

artifactId:这个表示模块的名字

version(版本):自定义就醒了


8,manven标准目录结构:

各位同学首相想一想,我们最终开发出来的代码,一般会分为哪些部分?

1,核心代码部分,就是我们具体的java代码。

2,有些东西,比如我们的项目配置参数,可能需要根据不同的原因频繁的做修改。这个配置文件是不需要打包到jar包中的,我们修改了配置文件,重启一下项目就行,不需要重新打包。

3,单元测试代码部分(之后讲)

4,测试配置文件。

这个时候,我们可以发现,在传统的Web工程中,只给我们提供一个src目录,显然是不够我们使用的。这个时候Maven就为我们做好了标准的目录规范。

  • src/main/java:核心代码部分
  • src/main/resource:配置文件部分
  • src/test/java:测试代码部分
  • src/test/resource 测试配置文件部分
  • src/main/webapp:页面资源,js,css,图片,html,jsp等等

9,仓库:

我们知道Maven工程在工程内不会存放第三方Jar包,这些第三方Jar包都是通过坐标的方式去对应的jar包仓库里面获取的。那么这个仓库究竟在什么地方呢?

在默认的情况下,我们的仓库在 用户目录/.m2/repository。我们以windows 10操作系统举例,这个目录在"C:\Users\Administrator\.m2\repository"。一般情况下,我们可以修改一下路径,因为我们这个仓库放在c盘下面其实很不好,因为如果我们重装了操作系统,是不是全丢了。

如何修改这个默认目录:

  • 在D盘新建一个目录用来存放。
  • 我们打开maven的配置文件,然后编写:<localRepository>D:\softdata\maven_resp</localRepository>

 


10,Maven命令的基本使用

先打开cmd,然后进入刚刚创建好的模块的目录。这里为了做实验方便,最好我是关闭idea。

  • mvn clean:我们运行完了这个命令之后,模块中的target目录会被删除。target目录就是我们的maven给我们编译,打包之后的存放class文件和jar文件的目录。这个clean命令,就是删除这个目录。
  • mvn compile:运行了这个命令之后,target目录又出现了,然后再target的classes目录下我们发现了存放java源代码编译之后的class文件。
  • mvn test:这个是和自动化单元测试相关的信息,它会编译test里面的java文件,然后运行对应的单元测试代码。然后生成对应的单元测试报告。
  • mvn package : 这个是对项目进行打包,这个命令首先会对项目中的java文件进行编译,编译好了进行单元测试,再进行打包,然后把打包好的jar文件存放在target目录下面。
  • mvn install:我们可以看到,这个命令还是会先对项目进行编译,测试,打包。然后把打好包的这个项目安装到我们的jar包仓库。这个方便以后其他的项目如果要使用我们的jar包,可以直接引用。

上面的这些命令,每一个命令都是有一个插件来支撑的,这个插件在我们首次使用的时候,maven会自动去中央仓库下载。


11,Maven生命周期

通过之前我们说过的对maven项目的构建分为几个阶段,分别是:

  • 清除编译信息:mvn clean
  • 编译:mvn compile
  • 测试:mvn test
  • 打包:mvn package
  • 安装:mvn install
  • 发布:mvn deploy

对于上面的构建的阶段,我们一般可以分为两个生命周期:

1,清除编译信息,就是清理生命周期。

2,后面的5个命令表示默认的生命周期。这个生命周期的一大显著特点就是我们执行后面的一些命令的时候,前面的命令会自动执行一次。比如我们执行install命令,那么前面的compile,test, package会自动执行一次。


12,不使用骨架如何在idea中创建一个java工程

1,和我们之前创建maven项目一模一样,只不过不需要选择任何的模板。

2,填写坐标

3,我们再src目录下创建对应的包,然后编写Java代码。

4,现在可能还没有办法运行,这个时候,我们应该设置java版本为11,还有编译版本也是11:

然后再在pom.xml中,设置一下编译器,jdk的版本:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <java.version>11</java.version>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

最后,我们reimport一下,然后再运行就可以了。

我们可以看到,自己创建出来的目录结构其实和Maven标准的目录结构已经非常接近了。并且没有给我们引入一些不不要的东西。所以老师推荐大家以后要是创建java的maven项目,最好不要使用骨架。


13,使用骨架如何在idea中创建一个JavaWeb工程

1,同样还是创建Maven工程

2,选择骨架:

记住我们选择的是maven-archetype-webapp。不要选错了。

3,接着,填写坐标等信息,然后下一步

4,当idea上出现build success的时候,这个工程就已经创建好了。

5,这个时候我们发现,创建的目录下之后src/main/webapp目录。那么如果我们想要写Java代码,我们需要手动的补齐src/main/java目录

6,补齐了之后,可能我们再java目录下还没有办法创建包和class,这个时候,我们只需要做一下reimport操作就好了。


14,在Maven创建Web工程下编写小案例

我们创建一个Servlet,获取从网页上提交过来的username数据。然后再jsp上展示。

1,在src下面创建一个包,然后再包里面创建一个Servlet。但是我们可以看到我们创建的这个servlet文件会报错。这个是因为我们创建的maven的web工程里面一个jar包都没有,包括我们servlet api的jar包都没有。

2,引入servlet api的jar包,我们可以在pom.xml中配置servlet api的坐标。但是这个坐标是什么我们根本就不知道。老师给大家介绍一个网站,你可以到这个网站上去查询,不过这个网站是外网的,可能你访问有点慢:https://mvnrepository.com/

<dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

引入了之后,我们还需要reimport一下。

3,编写对应的代码。

4,我们配置一个Tomcat服务器,然后启动项目。启动之后,我们访问页面,我们发现EL表达式无法正常使用。这个时候我们需要加入如下代码:

<%@ page isELIgnored="false" %>

 


15,maven插件方式部署Web项目

上一节同学们学习了一下,就是我们自己配置一个tomcat服务器,然后运行项目的案例。但是每一次启动一下tomcat其实是非常耗时的。我们使用maven之后,老师给大家推荐,我们可以使用maven的tomcat插件来快速的启动项目。

但是很遗憾,tomcat的mvan插件,现在只支持到7版本。而7的版本不支持Servlet api 4.0,所以说如果我们要使用插件的方式来启动Tomcat,我们只能使用Servlet api3.X的版本。首先我们把Servlet api换成3的版本。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

接下来,我们引入Tomcat7的maven插件,我们再build标签下面增加Tomcat的插件配置:

<plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>80</port>
                    <path>/mavenweb</path>
                    <uriEncoding>UTF-8</uriEncoding>
                </configuration>
            </plugin>
        </plugins>

2,直接运行项目 mvn clean tomcat7:run 命令就可以启动了。


16,scope的作用

我们之前引入Servlet api或者jsp api的时候,我们都设置了一个属性scope。这个属性是做什么的呢?老师告诉一下大家,这个属性的作用是设置我们依赖的jar包的有效范围。具体取值如下:

  • compile:为默认的有效范围。如果定义依赖关系的时候,没有明确的指定依赖的有效范围的话,那么这个就是默认的有效范围。在编译,运行,测试的时候都有效。
  • provided:在编译测试的时候有效,在运行的时候无效。比如我们的servlet api,我们再运行项目的时候,tomcat容器是不是自己就给我们已经提供好了这个对应的jar包了,那么我们就不需要maven再引入一次。
  • runtime:在运行,测试的时候有效。但是在编译的时候无效。比如我们得jdbc驱动,druid连接池,我们再编写代码的时候,只需要使用到jdbc为我们提供的接口就行,或者是datasource接口。只有再测试或者运行的时候才会用到具体的驱动或者连接池。
  • test:只有测试的时候有效,比如junit
  • system:在编译测试的时候有效,但是运行的时候无效。和provided的区别是,使用system范围的依赖时,必须通过systemPath元素显式的指定依赖文件的路劲。由于此类依赖不是通过maven仓库解析的,而是余本机系统绑定,可能造成构建的不可移植的问题,因此老师不建议大家使用

 

 

 

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

V哥学It

赏小的一个钱吧

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

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

打赏作者

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

抵扣说明:

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

余额充值