生产过程中需要Maven吗?
- maven真的需要吗?
Maven 是干什么用的?这是很多同学在刚开始接触 Maven 时最大的问题。之所以会提出这个问题, 是因为即使不使用 Maven 我们仍然可以进行 B/S 结构项目的开发。从表述层、业务逻辑层到持久化层 再到数据库都有成熟的解决方案——不使用 Maven 我们一样可以开发项目啊?
Maven 并不是直接用来辅助编码的,它战斗的岗位并不是以上各层。所 以我们有必要通过企业开发中的实际需求来看一看哪些方面是我们现有技术的不足。
生产环境下开发对Maven的需求
- 目前技术在开发中存在的问题
-
一个项目就是一个工程
- 如果一个项目非常庞大,就不适合继续使用package划分模块,最好是每一个模块对应一个工程,利于分工协作,
- 一个项目可以借助于Maven将一个项目拆分成多个工程
-
项目中需要的jar包必须手动"复制","粘贴"到WEB-INF/lib目录下
- 带来的问题是:同样的jar包文件重复出现在不同的项目工程中.一方面浪费存储空间,另外也让工程比较臃肿
- 借助于maven,可以将jar包仅仅保存在"仓库中",有需要使用的工程引用这个文件接口,并不需要真正复制这个jar包.
-
jar包需要别人替我们提供好,或者去官网下载
- 不同技术的官网提供jar包下载的形式是五法八门的.
- 有些技术的官网就是通过Maven或SVN等专门的工具来提供下载的.
- 如果以非正式的方式下载的jar包,那么其中的内容可能也是不正规的.
- 借助于Maven可以以一种规范的方式下载jar包,因为所有知名框架或第三方工具的jar包以及按照统一的规范放在了Maven的中央仓库之中.
- 以规范的方式下载jar包,内容也是可靠的
统一的规范,不仅是对IT开发领域非常重要,对于整个人类社会都是非常重要的
- 项目kar包依赖其他的jar包需要自己手动加到项目中
- 例如:FIleUpload组件–>commons-fileipload1.3.jar依赖于commons-io-2.0.jar
- 如果所有的jar包之间的依赖关系都需要程序员自己非常清楚的了解,那么就会极大的增加学习成本.
- Maven会自动将被依赖的jar包导入进来.
构建的概念
-
maven是一款服务于java平台的自动化构建工具.
- Make–Ant–Maven–Gradle
-
概念:
以java源文件,框架配置文件,JSP,HTML,图片等资源为原材料,去生产一个可以运行的项目的过程
-
构建可以分为以下三步
- 编译
- 部署
- 搭建
-
编译
- 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 错误.
自动化构建和构建环节
-
构建过程中的各个环节
- 清理:将以前编译得到的就得class字节码文件删除,为下一次编译做准备
- 编译:将java源程序编译成class字节码文件
- 测试:自动测试,自动调用junit程序
- 报告:测试程序执行的结果
- 打包:动态web工程打war包,java工程打jar包
- 安装:Maven特定的概念----将打包得到的文件复制到""仓库"中的指定位置
- 部署将动态web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行.
-
自动化构建
-
在IDE工具还不是很智能的年底啊,以上的工作都需要程序员自己手工完成,这就导致了大量的重复工作,而Maven将这些步骤都封装了起来,不再需要程序员手工处理了,这也就大大的提高了工作效率和生产速度.
部署Maven核心程序
- 安装maven核心程序
- 检查JAVA_HOME环境变量,maven也是java编写的程序,所以运行是也需要java的虚拟机
2. 解压Maven核心程序建议解压到一个非中文没有空格的目录下.
- 配置Maven 相关的环境变量
1. 配置MAVEN_HOME或者是M2_HOME(以前Maven的版本配置的变量为M2_HOME,为了向下兼容低版本,所以可以配置为M2_HOME,而且配置M2_HOME可以防止一些奇怪的错误)
- 添加M2_HOME 环境变量(不包含bin目录)
- 添加PATH的环境变量(包含bin目录)
- 在CMD中输入 “mvn -v”,测试环境是否配置正确
约定的目录结构说明
-
maven的核心概念
- 约定的目录结构
- pom
- 坐标
- 仓库
- 生命周期/插件/目标
- 继承
- 聚合
-
创建第一个Maven工程
- 创建约定的目录结构
- 根目录:工程名
- src:源码
- pom.xml文件:Maven工程的核心配置文件
- main目录:存放主程序
- test目录:存放测试程序
- java目录:存放java源文件
- resource目录:存放框架配置文件或其他工具的配置文件
- 创建约定的目录结构
- 为什么要遵守约定的目录结构?
- 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>