前面介绍了maven是一个项目管理工具,可用于项目各个阶段的管理,以及对依赖的管理。下面继续对maven继续做进一步的介绍。
项目的生命周期也就是maven的生命周期,包括 清理->编译->测试->打包->部署 等。maven的生命周期是抽象的,其中的具体任务都交给插件来完成,插件位置 %本地仓库%\org\apache\maven\plugins
。需要哪些插件,以及什么时候用这些插件都不用我们来考虑。
周期阶段/pom指令 | 含义 |
---|---|
validate | 验证相关的依赖是否好用 |
clean | 清空target里的内容(相关的测试文件、包等) |
compile | eclipse已经编译了,就不需要我们编译了 |
test | 测试,测试之前默认会执行clear和compile |
package | 打包,将编译的代码打包成 jar/war包 |
install | 一般将jar包发布到本地仓库,war包发布到服务器 |
deploy | 将包发布到远程仓库 |
仓库:是一个文件夹,用来存储maven项目的所有构件
构件:可以是一个插件,也可以是一个依赖,或者是项目构建的输出
本地仓库:就是我们在本地创建的一个存放构件的文件夹
远程仓库:远程仓库
中央仓库:国外的一个用于存放所有构件的仓库
镜像仓库:由于中心仓库在国外,我们的访问速度比较慢,故在国内搭建一个镜像仓库,便于我们访问
私服:公司搭建的仓库
这里只介绍了一个「传递性」
依赖的范围指明依赖可以起作用的范围,如果不指定 scope
,默认是 编译、运行、测试都起作用。
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13version>
<scope>testscope>
dependency>
dependencies>
maven在构建过程有3套classpath,我们会根据配置依赖的范围 依赖不同的classpath,如下图:
依赖范围 | 说明 |
---|---|
compile | 编译、运行、测试全过程都起作用 |
provided | 编译、测试过程起作用 |
runtime | 运行、测试过程起作用 |
test | 测试过程起作用 |
比如:A依赖B,B依赖C,那么A就传递依赖C。
根据依赖的传递性,当我们引入一个依赖时,依赖特性会很方便的帮我们下载它的相关依赖。弊端在于存在一些不必要的依赖时,可能会产生依赖冲突。
在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>
首先我们需要解释一下什么是显式依赖和隐式依赖。
聚合模块是项目目录的最顶层,其它模块作为聚合模块的子模块而存在。目的是可以一次构建多个项目模块。项目比较大的时候才会用到
测试:
注意:以上打包的项目是在对应的项目下打包,而不是在该聚合模块下打包
如下截图,表明打包成功!也可以在对应的项目下查看是否打包成功。
子模块继承父模块后,就可以使用父模块中的功能。可减少代码冗余,提高的代码的可重用性、可维护性。
标签 | 说明 |
---|---|
groupId | 项目组 ID ,项目坐标的核心元素 |
artifactId | 项目名ID,项目坐标的核心元素 |
version | 项目版本,项目坐标的核心元素 |
description | 项目描述信息 |
properties | 自定义的 Maven 属性 |
dependencies | 项目的依赖配置 |
dependencyManagement | 项目的依赖管理配置 |
repositories | 项目的仓库配置 |
build | 项目的源码目录配置、输出目录配置、插件配置、插件管理配置等 |
右击项目----Java EE Tools — Generate Deployment Descriptor Stub 这样系统就会在src/main/webapp/WEB_INF文件加下创建web.xml文件
pom.xml
中需要添加如下插件,用来给javaEE项目打war包。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.3.1version>
plugin>
plugins>
build>
最后说明一下,maven的javaweb项目不需要添加lib文件夹,所有的依赖都通过 pom.xml
来添加。
测试主要是添加两个jsp页面,Login.jsp
用来输入登录信息,Success.jsp
用来显示登录成功的信息。LoginServlet.java
用来判断登录信息是否成功。
<%@ 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>
<%@ 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>
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);
}
}
以上就是今天要讲的内容,本文以入门的角度介绍了maven的生命周期,常用pom指令。对maven仓库、maven坐标的相关概念进行了简单的阐述。以及介绍了依赖的一个特性——传递性,由该特性引发的依赖冲突问题的解决方法。还讲到了maven的聚合模块,聚合的优势,这个在大项目中才会用到。最后讲了如何在eclipse上创建一个maven的javaweb项目,以及该项目的测试和运行。
以上仅为个人学习笔记,如果对你有帮助,不胜荣幸。如果有错漏之处,欢迎批评指正。