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

文章目录

  • 前言
  • 一、maven的生命周期与插件
    • 1.生命周期和插件的关系
    • 2.生命周期的重要阶段 / pom指令
  • 二、什么是maven仓库
    • 1.仓库和构件
    • 2.仓库的分类
    • 3.仓库中寻找构件的过程
  • 三、什么是maven坐标(依赖)
    • 1.什么是maven坐标(依赖)
    • 2.如何添加坐标(依赖)
  • 四、如何先将项目发布到本地仓库
  • 五、maven依赖的几个特性
    • 1.依赖范围——scope标签
    • 2.maven依赖的几个属性
      • 2.1依赖传递
      • 2.2依赖排除——exclusion标签
      • 2.3依赖排除和取消排除的方法(更简单)
    • 3.依赖冲突
      • 3.1依赖冲突的产生原因
      • 3.2依赖冲突的解决方法
  • 六、maven聚合模块
    • 1.创建聚合模块
    • 2.为聚合模块添加子模块——module标签
    • 3pom继承——parent标签
      • 3.1实现继承的方式
      • 3.2xml代码
  • 七、eclipse创建Javaweb项目
    • 1. 创建maven的javaweb项目
      • 1.1 创建Javaweb项目
      • 1.2 添加javaEE工具支持
      • 1.3 添加服务器依赖
      • 1.4 如果eclipse版本是20以上
      • 1.5 如果你的项目还有×号显示
      • 1.6 最后说明
    • 2. 测试该javaweb项目
      • 2.1 项目结构
      • 2.2 Login.jsp
      • 2.3 Success.jsp
      • 2.4 LoginServlet.java
    • 3. 运行展示
      • 3.1 登录页面
      • 3.2 登录失败页面
      • 3.3 登录成功页面
  • 总结


前言

前面介绍了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.仓库的分类

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第1张图片
本地仓库:就是我们在本地创建的一个存放构件的文件夹
远程仓库:远程仓库
中央仓库:国外的一个用于存放所有构件的仓库
镜像仓库:由于中心仓库在国外,我们的访问速度比较慢,故在国内搭建一个镜像仓库,便于我们访问
私服:公司搭建的仓库

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

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第2张图片

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

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

坐标/依赖是标识构件在仓库中的唯一位置
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第3张图片

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

  1. 打开仓库

  2. 搜索依赖 maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第4张图片
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第5张图片
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第6张图片

  3. 在 pom文件中添加依赖
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第7张图片

四、如何先将项目发布到本地仓库

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第8张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第9张图片

五、maven依赖的几个特性

这里只介绍了一个「传递性」

1.依赖范围——scope标签

依赖的范围指明依赖可以起作用的范围,如果不指定 scope,默认是 编译、运行、测试都起作用。

<dependencies>
	<dependency>
	    <groupId>junitgroupId>
	    <artifactId>junitartifactId>
	    <version>4.13version>
	    
	    <scope>testscope>
	dependency>
  dependencies>

maven在构建过程有3套classpath,我们会根据配置依赖的范围 依赖不同的classpath,如下图:
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第10张图片

依赖范围 说明
compile 编译、运行、测试全过程都起作用
provided 编译、测试过程起作用
runtime 运行、测试过程起作用
test 测试过程起作用

2.maven依赖的几个属性

2.1依赖传递

比如:A依赖B,B依赖C,那么A就传递依赖C。

根据依赖的传递性,当我们引入一个依赖时,依赖特性会很方便的帮我们下载它的相关依赖。弊端在于存在一些不必要的依赖时,可能会产生依赖冲突。

2.2依赖排除——exclusion标签

exclusion标签中,添加该依赖的组织id项目id即可排除该依赖

<dependencies>
	<dependency>
	    <groupId>junitgroupId>
	    <artifactId>junitartifactId>
	    <version>4.13version>
	    <scope>testscope>
	    
	    <exclusions>
	    	<exclusion>
	    		<groupId>org.hamcrestgroupId>
	    		<artifactId>hamcrest-coreartifactId>
	    	exclusion>
	    exclusions>
	dependency>
  dependencies>

2.3依赖排除和取消排除的方法(更简单)

  1. 依赖排除
    进入 pom
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第11张图片
    可能出现的问题:
    在点排除某个依赖的时候,排除了同类型的其它依赖。这样的话,只要取消依赖排除即可。

  2. 取消依赖排除
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第12张图片

3.依赖冲突

3.1依赖冲突的产生原因

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

  1. 显式依赖:
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第13张图片
  2. 隐式依赖
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第14张图片
    我们在引入一些依赖时,它的隐式依赖可能和一些显式依赖同一种依赖,只是版本号不同,这时就会产生系统到底要使用哪个依赖的问题。

3.2依赖冲突的解决方法

  1. 短路优先原则。从项目根路径出发,路径短的优先。举例如下:
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第15张图片
  2. 根据依赖的声明顺序,先声明谁,谁的优先级就更高。举例如下:
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第16张图片
  3. 根据上述案例,如果我们想要使用的是4.0版本的junit,而不是3.8版本的junit,那该怎么办呢?
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第17张图片
    如何删除依赖,以及删除依赖可能出现的问题,可以参照(五、2.2和2.3)

六、maven聚合模块

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

1.创建聚合模块

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第18张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第19张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第20张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第21张图片

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

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第22张图片
测试:
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第23张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第24张图片
注意:以上打包的项目是在对应的项目下打包,而不是在该聚合模块下打包

如下截图,表明打包成功!也可以在对应的项目下查看是否打包成功。
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第25张图片

3pom继承——parent标签

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

3.1实现继承的方式

  1. 建项目时,添加 pom父继承(第一种方式)
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第26张图片
  2. 自己在子模块的 pom文件中加入parent标签(第二种方式)
    maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第27张图片

3.2xml代码

标签 说明
groupId 项目组 ID ,项目坐标的核心元素
artifactId 项目名ID,项目坐标的核心元素
version 项目版本,项目坐标的核心元素
description 项目描述信息
properties 自定义的 Maven 属性
dependencies 项目的依赖配置
dependencyManagement 项目的依赖管理配置
repositories 项目的仓库配置
build 项目的源码目录配置、输出目录配置、插件配置、插件管理配置等

这里介绍一下 properties
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第28张图片

七、eclipse创建Javaweb项目

1. 创建maven的javaweb项目

1.1 创建Javaweb项目

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第29张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第30张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第31张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第32张图片

1.2 添加javaEE工具支持

右击项目----Java EE Tools — Generate Deployment Descriptor Stub 这样系统就会在src/main/webapp/WEB_INF文件加下创建web.xml文件
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第33张图片

1.3 添加服务器依赖

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第34张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第35张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第36张图片

1.4 如果eclipse版本是20以上

pom.xml 中需要添加如下插件,用来给javaEE项目打war包。

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.pluginsgroupId>
			<artifactId>maven-war-pluginartifactId>
			<version>3.3.1version>
		plugin>
	plugins>
build>

1.5 如果你的项目还有×号显示

清空一下target文件,更新一下maven工程即可。
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第37张图片
maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第38张图片

1.6 最后说明

最后说明一下,maven的javaweb项目不需要添加lib文件夹,所有的依赖都通过 pom.xml 来添加。

2. 测试该javaweb项目

测试主要是添加两个jsp页面,Login.jsp 用来输入登录信息,Success.jsp 用来显示登录成功的信息。LoginServlet.java 用来判断登录信息是否成功。

2.1 项目结构

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第39张图片

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 heretitle>
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 heretitle>
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 登录页面

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第40张图片

3.2 登录失败页面

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第41张图片

3.3 登录成功页面

maven生命周期、maven仓库、maven坐标、项目发布、maven依赖、maven聚合、创建maven的javaweb项目_第42张图片


总结

以上就是今天要讲的内容,本文以入门的角度介绍了maven的生命周期,常用pom指令。对maven仓库、maven坐标的相关概念进行了简单的阐述。以及介绍了依赖的一个特性——传递性,由该特性引发的依赖冲突问题的解决方法。还讲到了maven的聚合模块,聚合的优势,这个在大项目中才会用到。最后讲了如何在eclipse上创建一个maven的javaweb项目,以及该项目的测试和运行。

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

你可能感兴趣的:(maven,maven,java,eclipse,java-ee,tomcat)