基本概念
-
什么是Maven
定义:Maven是一个项目管理工具,它包含了一个项目对象模型(POM: Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统费(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑.
-
Maven能解决什么问题
凡是开发项目,就需要导入jar包,而大型的工程,需要导入几十个乃至上百个,项目越大需要导入的jar包越多,而jar包多了,就会遇到各种让人抓狂的jar包冲突,版本冲突
我们写好的java文件,只认识0和1的白痴电脑是读不懂的,需要将它编译成二进制字节码.但是现在这项工作可以由各种集成开发工具帮我们完成,Eclipse,IDEA等可以将代码即时编译,而Maven也可以
凡是写代码就会有BUG,为了避免最后问题越来越多,我们在写代码的时候就需要进行单元测试,那也意味着我们的单元测试也会越来越多,如果按照以前的做法,即使单元测试再多,我们也需要一个一个的去测试,但是如果交给Maven来管理我们的项目,他就会把指定目录下的单元测试一次完成,并且告诉你哪些是正确的,哪些是有异常的
代码写出来是需要卖的,而我们在写完项目之后是需要打包的,而我们使用Eclipse,IDEA都需要手动打包,而使用Maven进行打包,只需要一个命令即可完成
可见在项目开发到最后运行到线上,整个过程中,Maven都可以帮我们解决问题
-
Maven依赖管理的概念
传统web工程 : jar包在项目中
maven开发的项目 : jar包不在项目中,而统一放在jar包仓库中(maven工程运行编译项目时,会通过jar包的坐标去jar包仓库中找到对应的jar包)
使用maven大大的节省了磁盘的空间(实现了代码可重用)
依赖管理 : maven工程的管理过程
-
项目的一键构建
-
什么是构建?
- 指的是项目从编译、测试、运行、打包、安装、部署整个过程都交给Maven进行管理,这个过程称为构建
-
一键构建
- 指的是整个构建过程,使用Maven一个命令可以轻松完成整个工作
例子 : 我们之前使用本地安装的Tomcat对项目编译、测试、运行、打包、安装、部署任何一步操作都是在构建项目,而Maven的一键构建是使用自身集成的Tomcat插件来完成
pom.xml : 存放着jar包的坐标
-
Maven的安装和仓库种类
-
Maven的安装
Apache-maven-3.5.2 下载地址 : http://archive.apache.org/dist/maven/maven-3/
-
需要解压到一个没有中文的路径下(E:\JAVA\apache-maven-3.5.3-bin\apache-maven-3.5.3)
bin : mvn命令用来构建项目
boot : Maven自身运行所需要的类加载器
conf : settings.xml是Maven主要的配置文件
lib : 拥有Maven自身运行所需要的jar包(类似有Tomcat插件)
配置环境变量MAVEN_HOME : E:\JAVA\apache-maven-3.5.3-bin\apache-maven-3.5.3\bin
-
仓库的种类和彼此的关系
本地仓库 : Maven会默认在我们的c盘创建本地仓库,打开settings.xml(Default: ${user.home}/.m2/repository),通过jar包的坐标找我们需要的jar包
中央仓库 : 如果我们电脑可以联网,本地仓库没有jar包,Maven会通过jar包的坐标去中央仓库下载jar包,如果没有联网就会报错(放置了几乎所有开源的jar包)
远程仓库(私服) : 在公司中,为了在不联网的情况下可以开发,也为了公司内部所需要的jar包可以放在一个统一的地方,我们会在创建一个远程仓库(私服),只需要确保自己的电脑和远程仓库在一个局域网,即可下载jar包,如果远程仓库中没有,它会从中央仓库进行下载,也可以通过本地上传的方式获取jar包
C盘的资源是非常宝贵的,所以我们可以通过<localRepository>/path/to/local/repo</localRepository>
这段代码重新指定本地仓库
<localRepository>E:\JAVA\maven_repository</localRepository>
Maven的标准目录结构和常用命令
- Maven标准目录结构
目录 核心代码部分
src/main/resources 配置文件部分
src/test/java目录 测试代码部分
src/test/resources 测试配置文件
src/main/webapp 页面资源,js,css,图片等等(建立web项目时)</pre>
-
Maven常用命令
mvn clean : 将编译好的文件删掉(将target目录删除)
mvn compile : 编译(在target目录中生成classes文件)
mvn test : 测试(在target目录中生成test-classes文件,也生成了classes文件)
mvn package : 打包(在target目录中将项目打包,也生成了test-classes文件,classes文件),pom.xml文件中<packaging>war<packaging>指定打包的格式
mvn install : 安装(做到了以上操作,并且将这个jar包放入了本地仓库)
Maven的生命周期和概念模型图
-
Maven生命周期
-
默认生命周期
编译(compile)
测试(test)
打包(package)
安装(install)
发布(deploy)
当我们执行到后面的命令时,前面的命令也就已经执行过一遍了
-
清理生命周期
- 清除(clean) : 清除项目编译信息
在我们编译项目之前,把之前项目编译的文件统统删除掉,是我们对项目进行构建的一个准备工作
站点生命周期 : 实际代码中用的并不多
-
-
Maven概念模型图 (两大核心功能)
27Y@NOX]2IV%G$(4YK3T.png)
-
项目对象模型(POM) : pom.xml 中存放着
项目自身信息
项目运行所依赖的jar包信息
项目运行环境信息,比如:jdk,tomcat信息
依赖管理模型(Dependency) : 放置着jar包的坐标,任何一个jar包坐标都必须有这三个部分组成,只能比这多不能比这少
<dependency> <groupid>javax.servlet.jsp</groupid> 公司组织的名称 <artifactid>jsp-api</artifactid> 项目名 <version>2.0</version> 版本号 </dependency>
以上整体就是Maven的第一个核心功能依赖管理,顾名思义项目对jar包的管理过程
-
Build lifecycie & phases : 构建生命周期
Maven分三套生命周期,最常见的是默认生命周期 compile,test,package,install,deploy
每次构建项目Maven底层都会有一个插件在工作, 每一个构建项目的命令对应了Maven底层的一个插件
以上整体就是Maven第二个的核心功能一键构建
-
使用骨架创建Maven的Java工程
-
IDEA集成Maven插件
-
打开软件,点击configure-project default-settings。配置maven目录。
还需要配置一个地方是本地仓库的优先,在runner-VM Options里面填写一下代码
-
-DarchetypeCatalog=internal</pre>
-
使用骨架创建Maven的Java工程
-
使用Maven的骨架 quickstart
-
声明项目坐标(Gorupid,Artifactid,Version)
-
再次确认当前使用的Maven环境
-
项目的名称和存放目录
Maven默认不会帮我们把main目录创建完整,需要我们自己手动书写目录结构
-
-
不使用骨架创建Maven的Java工程
不使用Maven骨架,不点击Create
和以上相同
推荐不使用骨架
-
使用骨架创建Maven的Web工程
使用Maven的骨架 webapp
和以上相同
-
需要自行建立一个java目录,用于存放java代码。注意的是要将其设置为源文件夹。
Maven工程Servlet实例
-
Maven工程Servlet实例之指定
- IDEA对每个目录所放置的文件格式是非常严格的,可以通过工程资源分配Project Settings-Modules进行对目录资源创建的指定
-
Maven工程Servlet实例之导入项
- 通过New-Servlet创建,需要补充web.xml的路径
<servlet-mapping> <servlet-name></servlet-name> <url-pattern></url-pattern> </servlet-mapping>
在java目录中新建包,创建一个servlet类,会出现报错信息。
报错原因是没有导入servlet-api的jar包,maven工程中需要我们去填写坐标进行导包。
- 配置pom.xml文件 在文件中dependencies标签中添加以下代码,可以使用idea的提示,会快很多。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
如果本地仓库没有jar包,那么我们只能从网络上下载(Maven中央仓库),搜索需要的jar包,复制jar包坐标至pom.xml文件中即可,建议本地仓库放置一些经常用的jar包,防止影响开发效率
启动项目 : 点击IDEA右侧Maven Projects-Lifecycle,双击生命周期即可,双击Execute Maven Goal填写tomcat:run执行,访问日志中的路径即可,但是会报错,解决问题如下
-
Maven工程Servlet实例之jar包冲突
我们打开tomcat-lib会发现,其中包含jsp-api,servlet-api,与我们之前在pom.xml文件中配置的信息相冲突
我们想要让它在编译的时候起作用,就要给这两个jar包定义一个作用域
此时会出现异常,是因为jar包冲突了。我们只需要在导入serlvet-api包的时候加上一句代码就可以了。同理,可如果jsp也出现了冲突,也要加。
<scope>provided</scope>
导入这段代码会使jar包在编译时起作用,真正项目运行的时候会使用tomcat插件中的jar包
junit包同理
<scope>test</scope>
-
Maven工程运行环境修改
- 定制模板Settings-live-点击+创建组custom-选中组+添加模板-Define选中XML
tomcat7插件 <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8888</port> </configuration> </plugin> jdk插件 <plugin> <groupId>org.apache.tomcat.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <target>1.8</target> <source>1.8</source> <encoding>UTF-8</encoding> </configuration> </plugin>
-
Maven的Java工程取mysql数据库
- 添加依赖
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>1.8.0</version> <scope>runtime</scope> </dependency>