文章目录
前言
前面介绍了maven是一个项目管理工具,可用于项目各个阶段的管理,以及对依赖的管理。下面继续对maven继续做进一步的介绍。
一、maven的生命周期与插件
1.生命周期和插件的关系
项目的生命周期也就是maven的生命周期,包括 清理->编译->测试->打包->部署 等。maven的生命周期是抽象的,其中的具体任务都交给插件来完成,插件位置 %本地仓库%\org\apache\maven\plugins
。需要哪些插件,以及什么时候用这些插件都不用我们来考虑。
2.生命周期的重要阶段 / pom指令
周期阶段/pom指令 | 含义 |
---|---|
validate | 验证相关的依赖是否好用 |
clean | 清空target里的内容(相关的测试文件、包等) |
compile | eclipse已经编译了,就不需要我们编译了 |
test | 测试,测试之前默认会执行clear和compile |
package | 打包,将编译的代码打包成 jar/war包 |
install | 一般将jar包发布到本地仓库,war包发布到服务器 |
deploy | 将包发布到远程仓库 |
二、什么是maven仓库
1.仓库和构件
仓库:是一个文件夹,用来存储maven项目的所有构件
构件:可以是一个插件,也可以是一个依赖,或者是项目构建的输出
2.仓库的分类
本地仓库:就是我们在本地创建的一个存放构件的文件夹
远程仓库:远程仓库
中央仓库:国外的一个用于存放所有构件的仓库
镜像仓库:由于中心仓库在国外,我们的访问速度比较慢,故在国内搭建一个镜像仓库,便于我们访问
私服:公司搭建的仓库
3.仓库中寻找构件的过程
三、什么是maven坐标(依赖)
1.什么是maven坐标(依赖)
坐标/依赖是标识构件在仓库中的唯一位置
2.如何添加坐标(依赖)
-
搜索依赖
-
在 pom文件中添加依赖
四、如何先将项目发布到本地仓库
五、maven依赖的几个特性
这里只介绍了一个「传递性」
1.依赖范围——scope标签
依赖的范围指明依赖可以起作用的范围,如果不指定 scope
,默认是 编译、运行、测试都起作用。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<!-- 这个就是依赖范围-->
<scope>test</scope>
</dependency>
</dependencies>
maven在构建过程有3套classpath,我们会根据配置依赖的范围 依赖不同的classpath,如下图:
依赖范围 | 说明 |
---|---|
compile | 编译、运行、测试全过程都起作用 |
provided | 编译、测试过程起作用 |
runtime | 运行、测试过程起作用 |
test | 测试过程起作用 |
2.maven依赖的几个属性
2.1依赖传递
比如:A依赖B,B依赖C,那么A就传递依赖C。
根据依赖的传递性,当我们引入一个依赖时,依赖特性会很方便的帮我们下载它的相关依赖。弊端在于存在一些不必要的依赖时,可能会产生依赖冲突。
2.2依赖排除——exclusion标签
在exclusion标签中,添加该依赖的组织id和项目id即可排除该依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
<!-- 这里是要排除的依赖 -->
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
2.3依赖排除和取消排除的方法(更简单)
-
依赖排除
进入pom
中
可能出现的问题:
在点排除某个依赖的时候,排除了同类型的其它依赖。这样的话,只要取消依赖排除即可。 -
取消依赖排除
3.依赖冲突
3.1依赖冲突的产生原因
首先我们需要解释一下什么是显式依赖和隐式依赖。
- 显式依赖:
- 隐式依赖
我们在引入一些依赖时,它的隐式依赖可能和一些显式依赖是同一种依赖,只是版本号不同,这时就会产生系统到底要使用哪个依赖的问题。
3.2依赖冲突的解决方法
- 短路优先原则。从项目根路径出发,路径短的优先。举例如下:
- 根据依赖的声明顺序,先声明谁,谁的优先级就更高。举例如下:
- 根据上述案例,如果我们想要使用的是4.0版本的junit,而不是3.8版本的junit,那该怎么办呢?
如何删除依赖,以及删除依赖可能出现的问题,可以参照(五、2.2和2.3)
六、maven聚合模块
聚合模块是项目目录的最顶层,其它模块作为聚合模块的子模块而存在。目的是可以一次构建多个项目模块。项目比较大的时候才会用到
1.创建聚合模块
2.为聚合模块添加子模块——module标签
测试:
注意:以上打包的项目是在对应的项目下打包,而不是在该聚合模块下打包
如下截图,表明打包成功!也可以在对应的项目下查看是否打包成功。
3pom继承——parent标签
子模块继承父模块后,就可以使用父模块中的功能。可减少代码冗余,提高的代码的可重用性、可维护性。
3.1实现继承的方式
- 建项目时,添加 pom父继承(第一种方式)
- 自己在子模块的 pom文件中加入
parent标签
(第二种方式)
3.2xml代码
标签 | 说明 |
---|---|
groupId | 项目组 ID ,项目坐标的核心元素 |
artifactId | 项目名ID,项目坐标的核心元素 |
version | 项目版本,项目坐标的核心元素 |
description | 项目描述信息 |
properties | 自定义的 Maven 属性 |
dependencies | 项目的依赖配置 |
dependencyManagement | 项目的依赖管理配置 |
repositories | 项目的仓库配置 |
build | 项目的源码目录配置、输出目录配置、插件配置、插件管理配置等 |
这里介绍一下 properties
七、eclipse创建Javaweb项目
1. 创建maven的javaweb项目
1.1 创建Javaweb项目
1.2 添加javaEE工具支持
右击项目----Java EE Tools — Generate Deployment Descriptor Stub 这样系统就会在src/main/webapp/WEB_INF文件加下创建web.xml文件
1.3 添加服务器依赖
1.4 如果eclipse版本是20以上
pom.xml
中需要添加如下插件,用来给javaEE项目打war包。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
1.5 如果你的项目还有×号显示
清空一下target文件,更新一下maven工程即可。
1.6 最后说明
最后说明一下,maven的javaweb项目不需要添加lib文件夹,所有的依赖都通过 pom.xml
来添加。
2. 测试该javaweb项目
测试主要是添加两个jsp页面,Login.jsp
用来输入登录信息,Success.jsp
用来显示登录成功的信息。LoginServlet.java
用来判断登录信息是否成功。
2.1 项目结构
2.2 Login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 用来显示错误信息 -->
<h1>${msg }</h1>
<form method="get" action="${pageContext.request.contextPath }/LoginServlet">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="name" value="admin"/></td>
</tr>
<tr>
<td>用户名</td>
<td><input type="password" name="pwd" value="admin"/></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>
2.3 Success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>登录成功!</h1>
</body>
</html>
2.4 LoginServlet.java
package com.servlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LoginServlet
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if (name.equals("admin") && pwd.equals("admin")) {
request.getRequestDispatcher("Success.jsp").forward(request, response);
}else {
request.setAttribute("msg", "用户名或密码错误!");
request.getRequestDispatcher("Login.jsp").forward(request, response);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
3. 运行展示
3.1 登录页面
3.2 登录失败页面
3.3 登录成功页面
总结
以上就是今天要讲的内容,本文以入门的角度介绍了maven的生命周期,常用pom指令。对maven仓库、maven坐标的相关概念进行了简单的阐述。以及介绍了依赖的一个特性——传递性,由该特性引发的依赖冲突问题的解决方法。还讲到了maven的聚合模块,聚合的优势,这个在大项目中才会用到。最后讲了如何在eclipse上创建一个maven的javaweb项目,以及该项目的测试和运行。
以上仅为个人学习笔记,如果对你有帮助,不胜荣幸。如果有错漏之处,欢迎批评指正。