尚硅谷Maven学习笔记

本文详细介绍了Maven在生产环境中的必要性及其在软件开发中的作用,包括解决项目拆分、依赖管理、自动化构建等问题。通过实例演示了Maven的安装配置、目录结构、坐标概念、仓库管理、生命周期、插件使用、Eclipse集成以及解决依赖冲突的方法。Maven简化了项目构建流程,提高了开发效率,是现代Java项目中不可或缺的工具。
摘要由CSDN通过智能技术生成

生产过程中需要Maven吗?

  • maven真的需要吗?

Maven 是干什么用的?这是很多同学在刚开始接触 Maven 时最大的问题。之所以会提出这个问题, 是因为即使不使用 Maven 我们仍然可以进行 B/S 结构项目的开发。从表述层、业务逻辑层到持久化层 再到数据库都有成熟的解决方案——不使用 Maven 我们一样可以开发项目啊?

在这里插入图片描述

Maven 并不是直接用来辅助编码的,它战斗的岗位并不是以上各层。所 以我们有必要通过企业开发中的实际需求来看一看哪些方面是我们现有技术的不足。

生产环境下开发对Maven的需求

  • 目前技术在开发中存在的问题
  1. 一个项目就是一个工程

    • 如果一个项目非常庞大,就不适合继续使用package划分模块,最好是每一个模块对应一个工程,利于分工协作,
    • 一个项目可以借助于Maven将一个项目拆分成多个工程
  2. 项目中需要的jar包必须手动"复制","粘贴"到WEB-INF/lib目录下

    • 带来的问题是:同样的jar包文件重复出现在不同的项目工程中.一方面浪费存储空间,另外也让工程比较臃肿
    • 借助于maven,可以将jar包仅仅保存在"仓库中",有需要使用的工程引用这个文件接口,并不需要真正复制这个jar包.
  3. jar包需要别人替我们提供好,或者去官网下载

    • 不同技术的官网提供jar包下载的形式是五法八门的.
    • 有些技术的官网就是通过Maven或SVN等专门的工具来提供下载的.
    • 如果以非正式的方式下载的jar包,那么其中的内容可能也是不正规的.
    • 借助于Maven可以以一种规范的方式下载jar包,因为所有知名框架或第三方工具的jar包以及按照统一的规范放在了Maven的中央仓库之中.
    • 以规范的方式下载jar包,内容也是可靠的

统一的规范,不仅是对IT开发领域非常重要,对于整个人类社会都是非常重要的

  1. 项目kar包依赖其他的jar包需要自己手动加到项目中
    • 例如:FIleUpload组件–>commons-fileipload1.3.jar依赖于commons-io-2.0.jar
    • 如果所有的jar包之间的依赖关系都需要程序员自己非常清楚的了解,那么就会极大的增加学习成本.
    • Maven会自动将被依赖的jar包导入进来.

构建的概念

  • maven是一款服务于java平台的自动化构建工具.

    • Make–Ant–Maven–Gradle
  • 概念:

以java源文件,框架配置文件,JSP,HTML,图片等资源为原材料,去生产一个可以运行的项目的过程

  • 构建可以分为以下三步

    1. 编译
    2. 部署
    3. 搭建
  • 编译

    • java源文件–>编译—>Class字节码文件,—>交给JVM区执行
  • 部署

    • 一个BS项目最终运行的并不是动态web工程本身,而是这个动态web工程"编译结果"
    • 动态Web工程—>编译,部署–>编译结果

运行时环境

所谓的运行其实是一组jar包的引用并没有把jar包本身复制到工程之中,并不是目录

  • 在Eclipse中创建项目时,往往会发现以下的结构

在这里插入图片描述

  • 其实libraries中的内容保存的就是运行项目时所需的基本开发包,编写java项目就要求有JDK开发包,运行tomcat项目就需要有运行tomcat所需的开发包,我们编写java程序类或者编写Servlet和JSP都需要有这些基本开发包,这就称之为运行时环境
  • 如果没有这些开发包的支持,那么也将无法编写java程序.

工程目录和编译结果

  • 观察变异结果和工程目录的区别

在这里插入图片描述

  • 一个动态web项目运行在的时候是不需要java源文件的,所以在工程中编写的*.java文件不会被保留到编译结果中,而是保留*.java文件编译后的*.class文件,所有的*.class文件都会保留到WEB-INF中.

  • 因此在编写路径的时候尽量用绝对路径,而不要使用相对路径.

  • 观察绝对路径和相对路径的区别

  • 在Chiken工程中的WebContent目录中编写index.jsp,该页面提供一个超链接,该超链接跳转到/WebContent/good/welcome.jsp页面中

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<a href="good/welcome.jsp">go to</a>
</body>
</html>
  • 编写/WebContent/good/welcome.jsp页面,该页面使用相对路径跳转到上一级中的index.jsp页面
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<a href="../index.jsp">back of</a>
</body>
</html>
  • 编写一个TargetServelet.java程序,改程序会跳转到good/welcome.jsp页面中
package mao.shu.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TargetServlet")
public class TargetServlet extends HttpServlet {
   
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
		req.getRequestDispatcher("/good/welcome.jsp").forward(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
		this.doGet(req, resp);
	}
}

  • 在index.jsp中添加一个超链接,该超链接跳转执行TargetServlet
	<a href="good/welcome.jsp">go to</a><br/>
	<a href="TargetServlet">go to Servlet</a>
  • 运行Tomcat,将Chiken项目发布到Tomcat中,

  • 发现访问index.jsp的时候,两个链接都能够跳转到/good/welcome.jsp中
    在这里插入图片描述

在这里插入图片描述

  • 但是如果是通过TargetServlet跳转到welcom.jsp中,再点击back of 无法跳转到 index.jsp页面中

在这里插入图片描述

  • 这是因为项目运行时,*.class文件都在WEB-IFO/classes中,而welcom.jsp使用的是相对路径"…/index.jsp","…/"表示返回上一层目录,而编译后的TargetServlet 所在的目录返回上一层目录后并没有 "/good/welcome.jsp"目录,所以也就会出现 404 错误.

自动化构建和构建环节

  • 构建过程中的各个环节

    1. 清理:将以前编译得到的就得class字节码文件删除,为下一次编译做准备
    2. 编译:将java源程序编译成class字节码文件
    3. 测试:自动测试,自动调用junit程序
    4. 报告:测试程序执行的结果
    5. 打包:动态web工程打war包,java工程打jar包
    6. 安装:Maven特定的概念----将打包得到的文件复制到""仓库"中的指定位置
    7. 部署将动态web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行.
  • 自动化构建

  • 在IDE工具还不是很智能的年底啊,以上的工作都需要程序员自己手工完成,这就导致了大量的重复工作,而Maven将这些步骤都封装了起来,不再需要程序员手工处理了,这也就大大的提高了工作效率和生产速度.

部署Maven核心程序

  • 安装maven核心程序
  1. 检查JAVA_HOME环境变量,maven也是java编写的程序,所以运行是也需要java的虚拟机

在这里插入图片描述
2. 解压Maven核心程序建议解压到一个非中文没有空格的目录下.

在这里插入图片描述

  1. 配置Maven 相关的环境变量
    1. 配置MAVEN_HOME或者是M2_HOME(以前Maven的版本配置的变量为M2_HOME,为了向下兼容低版本,所以可以配置为M2_HOME,而且配置M2_HOME可以防止一些奇怪的错误)
  • 添加M2_HOME 环境变量(不包含bin目录)

在这里插入图片描述

  • 添加PATH的环境变量(包含bin目录)

在这里插入图片描述

  • 在CMD中输入 “mvn -v”,测试环境是否配置正确

在这里插入图片描述

约定的目录结构说明

  • maven的核心概念

    1. 约定的目录结构
    2. pom
    3. 坐标
    4. 仓库
    5. 生命周期/插件/目标
    6. 继承
    7. 聚合
  • 创建第一个Maven工程

    1. 创建约定的目录结构
      1. 根目录:工程名
      2. src:源码
      3. pom.xml文件:Maven工程的核心配置文件
      4. main目录:存放主程序
      5. test目录:存放测试程序
      6. java目录:存放java源文件
      7. resource目录:存放框架配置文件或其他工具的配置文件

在这里插入图片描述

  1. 为什么要遵守约定的目录结构?
    • maven要负责我们这个项目的自动化构建:以编译为例,maven要想进行自动编译,那么他要知道java源文件保存在哪里.
    • 如果我们自定义的东西要想让框架或工具知道,有两种方式
      • 以配置的方式明确告诉框架
      • 遵守框架内部已存在的约定.

在开发中本着能用约定解决的问题就不用配置解决,能用配置解决的就不去编写代码

  • 约定>配置>编码

第一个Maven工程目录结构和文件内容

  • 在E盘中创建一个Hello文件夹,Hello表示为工程名称

在这里插入图片描述

  • 在Hello目录下创建src目录和一个pom.xml文件夹

在这里插入图片描述

  • pom.xml文件中的内容如下,其中
    • <project>标签为pom.xml文件的根标签
    • modelVersion是maven固定的写法格式
    • <groupId>,<artifactId>,<version>这三个标签表示项目当前的坐标
    • <dependencies>标签中存放项目开发包的依赖关系
<?xml version="1.0" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>mao.shu</groupId>
	<artifactId>Hello</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<name>Hello</name>
	  
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.0</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值