maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目


前言

前面介绍了maven是一个项目管理工具,可用于项目各个阶段的管理,以及对依赖的管理。下面继续对maven继续做进一步的介绍。


一、maven的生命周期与插件

1.生命周期和插件的关系

项目的生命周期也就是maven的生命周期,包括 清理->编译->测试->打包->部署 等。maven的生命周期是抽象的,其中的具体任务都交给插件来完成,插件位置 %本地仓库%\org\apache\maven\plugins。需要哪些插件,以及什么时候用这些插件都不用我们来考虑。

2.生命周期的重要阶段 / pom指令

周期阶段/pom指令含义
validate验证相关的依赖是否好用
clean清空target里的内容(相关的测试文件、包等)
compileeclipse已经编译了,就不需要我们编译了
test测试,测试之前默认会执行clear和compile
package打包,将编译的代码打包成 jar/war包
install一般将jar包发布到本地仓库,war包发布到服务器
deploy将包发布到远程仓库

二、什么是maven仓库

1.仓库和构件

仓库:是一个文件夹,用来存储maven项目的所有构件
构件:可以是一个插件,也可以是一个依赖,或者是项目构建的输出

2.仓库的分类

在这里插入图片描述
本地仓库:就是我们在本地创建的一个存放构件的文件夹
远程仓库:远程仓库
中央仓库:国外的一个用于存放所有构件的仓库
镜像仓库:由于中心仓库在国外,我们的访问速度比较慢,故在国内搭建一个镜像仓库,便于我们访问
私服:公司搭建的仓库

3.仓库中寻找构件的过程

在这里插入图片描述

三、什么是maven坐标(依赖)

1.什么是maven坐标(依赖)

坐标/依赖是标识构件在仓库中的唯一位置
在这里插入图片描述

2.如何添加坐标(依赖)

  1. 打开仓库

  2. 搜索依赖 在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 在 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依赖排除和取消排除的方法(更简单)

  1. 依赖排除
    进入 pom
    在这里插入图片描述
    可能出现的问题:
    在点排除某个依赖的时候,排除了同类型的其它依赖。这样的话,只要取消依赖排除即可。

  2. 取消依赖排除
    在这里插入图片描述

3.依赖冲突

3.1依赖冲突的产生原因

首先我们需要解释一下什么是显式依赖隐式依赖

  1. 显式依赖:
    在这里插入图片描述
  2. 隐式依赖
    在这里插入图片描述
    我们在引入一些依赖时,它的隐式依赖可能和一些显式依赖同一种依赖,只是版本号不同,这时就会产生系统到底要使用哪个依赖的问题。

3.2依赖冲突的解决方法

  1. 短路优先原则。从项目根路径出发,路径短的优先。举例如下:
    在这里插入图片描述
  2. 根据依赖的声明顺序,先声明谁,谁的优先级就更高。举例如下:
    在这里插入图片描述
  3. 根据上述案例,如果我们想要使用的是4.0版本的junit,而不是3.8版本的junit,那该怎么办呢?
    在这里插入图片描述
    如何删除依赖,以及删除依赖可能出现的问题,可以参照(五、2.2和2.3)

六、maven聚合模块

聚合模块是项目目录的最顶层,其它模块作为聚合模块的子模块而存在。目的是可以一次构建多个项目模块。项目比较大的时候才会用到

1.创建聚合模块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.为聚合模块添加子模块——module标签

在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述
注意:以上打包的项目是在对应的项目下打包,而不是在该聚合模块下打包

如下截图,表明打包成功!也可以在对应的项目下查看是否打包成功。
在这里插入图片描述

3pom继承——parent标签

子模块继承父模块后,就可以使用父模块中的功能。可减少代码冗余,提高的代码的可重用性、可维护性。

3.1实现继承的方式

  1. 建项目时,添加 pom父继承(第一种方式)
    在这里插入图片描述
  2. 自己在子模块的 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项目,以及该项目的测试和运行。

以上仅为个人学习笔记,如果对你有帮助,不胜荣幸。如果有错漏之处,欢迎批评指正。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员_动次动次

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值