Maven入门
威哥教育QQ群:673215016
威哥教育官网:http://www.vgxit.com
哔哩哔哩首页:https://space.bilibili.com/505541423
腾讯课堂首页:https://ruanqi.ke.qq.com/?tuin=cdc1dc7d
本博客对应视频教程:http://vgxit.com/course/18
目录
7,使用骨架在idea工具来创建一个Java的Maven工程
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仓库解析的,而是余本机系统绑定,可能造成构建的不可移植的问题,因此老师不建议大家使用。