Maven入门
Maven简介
-
概念模型:Maven[ˈmevən],是一个项目管理工具,它包含了一个项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
- 项目对象模型 ,一个 maven 工程有一个 pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、 插件目标等。
- 依赖管理系统,通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理。
- 一个项目生命周期,使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些 过程规范为一个生命周期。
- 一组标准集合, maven 将整个项目管理过程定义一组标准,比如:通过 maven 构建工程有标准的目录结构,有 标准的生命周期阶段、依赖管理有标准的坐标定义等。
- 插件目标,maven 管理项目生命周期过程都是基于插件完成的。
-
Maven的作用
- 依赖管理:用maven管理的项目,需要jar包时,只需要在pom.xml中添加对应的jar包坐标即可。
- 一键构建:项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理, maven 一个命令完成整个工作。
Maven仓库
本地项目会先到本地仓库查找项目需要jar包,如果有,直接使用,如果没有,会到远程仓库找,找到会下载到本地,没找到,会到中央仓库找,找到后本地仓库和远程仓库都会缓存一份。以便以后使用。当然如果没有远程仓库,则直接到中央仓库查找。
- 本地仓库(自己维护)
- 默认maven本地仓库位置在${user.dir}/.m2/repository,${user.dir}表示 windows 用户目录。形如C:\Users\ASUS.m2。
- 修改maven的本地仓库位置,可以在maven安装目录/conf/settings.xml的根标签内设置上。
<localRepository>D:\codetools\maven_repository</localRepository>
- 远程仓库(又称私服,公司维护)
- 远程仓库可以在互联网内也可以在局域网内。
- 中央仓库(maven团队维护)
- maven中内置一个远程仓库地址 http://repo1.maven.org/maven2 包含了世界上大部分流行的开源项目构件。
项目使用本地仓库的3种方式
- 在maven安装目录下的有 conf/setting.xml文件,用于maven的所有project项目,它作为maven的全局配置,即使用这台机器的所有用户都是用这个配置。
- 在${user.dir} /.m2/settings.xml文件,它作为maven的用户配置,即只有当前用户是这个配置。
- pom.xml文件是所在项目的局部配置。
- 配置优先级从高到低:pom.xml> User Settings > Global Settings 如果这些文件同时存在且有重复的配置,优先级高的配置会覆盖优先级低的。
Maven约定的目录结构
-
目录结构说明
- src/main/java —— 存放项目的.java 文件
- src/main/resources —— 存放项目资源文件,如 spring, hibernate 配置文件
- src/main/webapp —— 存放页面素材文件
- src/test/java —— 存放所有单元测试.java 文件,如 JUnit 测试类
- src/test/resources —— 测试资源文件
- target —— 项目输出位置,编译后的 class 文件会输出到此目录
- pom.xml——maven 项目核心配置文件 注意:必须遵守以上的目录结构,即约定大于配置。如果是普通的 java 项目,那么就没有 webapp 目录
-
pom.xml基本配置
<project>
:文件的根节点 .<modelversion>
: pom.xml 使用的对象模型版本<groupId>
:项目名称,一般写项目的域名<artifactId>
:模块名称,子项目名或模块名称<version>
:产品的版本号 .<packaging>
:打包类型,一般有 jar、war、pom 等<name>
:项目的显示名,常用于 Maven 生成的文档。<description>
:项目描述,常用于 Maven 生成的文档<dependencies>
:项目依赖构件配置,配置项目依赖构件的坐标<build>
:项目构建配置,配置编译、运行插件等
Maven的使用步骤
- jdk的安装与环境配置
- Maven软件的下载
- 在cmd中输入java -version查看java版本,然后根据maven与jdk版本对应关系 下载maven
- 在cmd中输入java -version查看java版本,然后根据maven与jdk版本对应关系 下载maven
- Maven软件的安装
- 将Maven解压到一个没有中文,空格的路径下即可
- Maven解压后的目录如下
- Maven环境配置
- 右击此电脑->属性->高级系统设置->高级选项卡->环境变量
- 系统变量中,新建变量名:MAVEN_HOME,变量值:maven安装的路径(bin 目录之前一级目录)
- 系统变量Path中,新加一行%MAVEN_HOME%\bin
- Maven软件版本测试
- 在cmd输入
mvn -v
,成功看到maven版本及Java版本即安装成功。
- 在cmd输入
Maven的常用命令
执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录打开cmd输入命令:
后面的命令包含前面的命令的相关操作
-
mvn clean
:删除target目录及内容,因为每个人的电脑开发环境不一定相同 -
mvn compile
:将 src/main/java 下的文件编译为 class 文件输出到 target目录下 -
mvn test
:将 src/test/java 下的文件编译为 class 文件输出到 target目录下 -
mvn package
:对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war包。 -
mvn install
:maven 打成 jar 包或 war 包发布到本地仓库。
Maven生命周期
maven 对项目构建过程分为三套 相互独立的生命周期
生命周期的每一步都有底层的周期去执行
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。 Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。 Site Lifecycle 生成项目报告,站点,发布站点。
- Clean Lifecycle
- 执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段
生命周期阶段 | 描述 |
---|---|
pre-clean | 执行一些需要在clean之前完成的工作 |
clean | 移除所有上一次构建生成的文件 |
post-clean | 执行一些需要在clean之后立刻完成的工作 |
- Default Lifecycle
- Maven 的主要生命周期,被用于构建应用,包括下面的 23 个阶段
生命周期阶段 | 描述 |
---|---|
validate(校验) | 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 |
initialize(初始化) | 初始化构建状态,比如设置属性值。 |
generate-sources(生成源代码) | 生成包含在编译阶段中的任何源代码。 |
process-sources(处理源代码) | 处理源代码,比如说,过滤任意值。 |
generate-resources(生成资源文件) | 生成将会包含在项目包中的资源文件。 |
process-resources (处理资源文件) | 复制和处理资源到目标目录,为打包阶段最好准备。 |
compile(编译) | 编译项目的源代码。 |
process-classes(处理类文件) | 处理编译生成的文件,比如说对Java class文件做字节码改善优化。 |
generate-test-sources(生成测试源代码) | 生成包含在编译阶段中的任何测试源代码。 |
process-test-sources(处理测试源代码) | 处理测试源代码,比如说,过滤任意值。 |
generate-test-resources(生成测试资源文件) | 为测试创建资源文件。 |
process-test-resources(处理测试资源文件) | 复制和处理测试资源到目标目录。 |
test-compile(编译测试源码) | 编译测试源代码到测试目标目录. |
process-test-classes(处理测试类文件) | 处理测试源码编译生成的文件。 |
test(测试) | 使用合适的单元测试框架运行测试(Juint是其中之一)。 |
prepare-package(准备打包) | 在实际打包之前,执行任何的必要的操作为打包做准备。 |
package(打包) | 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 |
pre-integration-test(集成测试前) | 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 |
integration-test(集成测试) | 处理和部署项目到可以运行集成测试环境中。 |
post-integration-test(集成测试后) | 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 |
verify (验证) | 运行任意的检查来验证项目包有效且达到质量标准。 |
install(安装) | 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 |
deploy(部署) | 将最终的项目包复制到远程仓库中与其他开发者和项目共享。 |
- Site Lifecycle
- Maven Site 插件一般用来创建新的报告文档、部署站点等。
生命周期阶段 | 描述 |
---|---|
pre-site | 生成项目站点之前需要完成的工作 |
site | 生成项目站点文档 |
post-site | 生成项目站点之后需要完成的工作 |
site-deploy | 将项目站点发布到服务器 |
IDEA创建Maven项目
IDEA集成Maven插件
使用模板创建maven的java项目
不使用模板创建maven的java项目
其他步骤与使用模板创建maven的java项目一致。
因为不用模板创建maven的Java项目更接近标准目录结构,所以maven的Java项目一般建议不用模板。
使用模板创建maven的web项目
新建web项目
其他步骤与使用模板创建maven的java项目一致。
创建servlet并引入jar包坐标
在src/mian目录下创建java目录,使其出现Create New Servlet选项,可对该web项目指定web资源包
在src/main/java目录下创建一个servlet,并接下来访问它
package com.simplek9.servlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
request.getRequestDispatcher("/hello.jsp").forward(request,response);
}
}
在src/mian/webapp/WEB-INF/web.xml的根标签内配置servlet
<servlet>
<servlet-name>Servlet</servlet-name><!--Create New Servlet预先创建好的-->
<servlet-class>com.simplek9.servlet.Servlet</servlet-class>
</servlet>
<servlet-mapping><!--手动配置-->
<servlet-name>Servlet</servlet-name>
<url-pattern>servlet</url-pattern>
</servlet-mapping>
在pom.xml的根标签内导入jar包的坐标
- 添加依赖需要指定依赖 jar 包的坐标,但是很多情况我们是不知道 jar 包的的坐标,可以通过互联网搜索方式查询:
- Maven Central Repository Search
- Maven Repository: Search/Browse/Explore (mvnrepository.com)
<!--放置项目运行所依赖的jar包-->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId><!--项目名称,定义为组织名+项目名,类似包名-->
<artifactId>servlet-api</artifactId><!-- 模块名称 -->
<version>2.5</version><!-- 当前项目版本号,snapshot 为快照版本即非正式版本,release 为正式发布版本 -->
<scope>provided</scope><!--编译时起作用,项目运行时不起作用-->
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope><!--编译时起作用,项目运行时不起作用-->
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId><!--测试类所需jar包-->
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
解决jar包冲突
-
问题:因为如上代码引入了jservlet-api,jsp-api,但是tomcat安装目录的lib文件夹下也存在一样的jar包,所以会产生冲突。
-
解决办法:在pom.xml中引入jar包坐标时指定依赖范围
依赖范围 | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行classpath有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
provided | Y | Y | Junit | |
runtime | Y | Y | servlet-api | |
test | Y | JDBC驱动 | ||
system | Y | Y | 本地的,Maven仓库之外的类库 |
- compile:默认依赖范围,会用在编译、测试、运行。
- provided:provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用。如servlet-api,jsp-api被 tomcat 容器提供。
- system:system 范围依赖与 provided 类似,但是必须显式的提供一个对于本地系统中 JAR文件的路径,需要指定 systemPath 磁盘路径,system依赖不推荐使用。
IDEA运行maven指令
Maven中的Tomcat是6.0,这个版本的不支持jdk1.8的,所以根据 tomcat与jdk的配对关系 配置相应tomcat
添加 tomcat7 插件需要在pom.xml的中添加以下代码
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>