文章目录
1、Maven介绍
1.1 什么是Maven
Maven 是一个项目管理工具,它包含了一个 项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
1.2 Maven能解决什么问题
上面一段话说了跟没说一样,还是先知道Maven是干嘛的先。
我们知道,项目开发不仅仅是写写代码而已,期间会伴随着各种必不可少的事情要做,下面列举几个感受一下:
1、我们需要引用各种 jar 包,尤其是比较大的工程,引用的 jar 包往往有几十个乃至上百个, 每用到一种 jar 包,都需要手动引入工程目录,而且经常遇到各种让人抓狂的 jar 包冲突,版本冲突。
2、我们辛辛苦苦写好了 Java 文件,可是只懂 0 和 1 的白痴电脑却完全读不懂,需要将它编译成二进制字节码。好歹现在这项工作可以由各种集成开发工具帮我们完成,Eclipse、IDEA 等都可以将代码即时编译。当然,如果你嫌生命漫长,何不铺张,也可以用记事本来敲代码,然后用 javac 命令一个个地去编译,逗电脑玩。
3、世界上没有不存在 bug的代码,计算机喜欢 bug就和人们总是喜欢美女帅哥一样。为了追求美为了减少 bug,因此写完了代码,我们还要写一些单元测试,然后一个个的运行来检验代码质量。
4、再优雅的代码也是要出来卖的。我们后面还需要把代码与各种配置文件、资源整合到一起,定型打包,如果是 web项目,还需要将之发布到服务器,供人蹂躏。
试想,如果现在有一种工具,可以把你从上面的繁琐工作中解放出来,能帮你构建工程,管理 jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成 Web 站点,你会心动吗?Maven 就可以解决上面所提到的这些问题。
2、Maven的安装
2.1 下载
下载地址:https://maven.apache.org/download.cgi
把下载好的zip解压到一个没有空格的路径下,解压后目录结构如下(我下载的是3.5.2版本):
bin:存放了 maven 的命令;
boot:存放了一些 maven 本身的引导程序,如类加载器等;
conf:存放了 maven 的一些配置文件,如 setting.xml 文件;
lib:存放了 maven 本身运行所需的一些 jar 包。
2.2 配置
Maven是通过命令来交互的软件,因此需要配置环境变量。
jdk的环境变量要保证没有错误,因为maven编译项目是要用上jdk的。
配置好了后打开cmd输入命令来测试配置是否正确:
看到maven的版本和jdk版本和我们配置的一样,就安装成功了。
3、Maven仓库
3.1 介绍
maven 的工作需要从仓库下载一些 jar 包,如下图所示,本地的项目 A、项目 B 等都会通过 maven软件从远程仓库(可以理解为互联网上的仓库)下载 jar 包并存在本地仓库,本地仓库 就是本地文件夹,当第二次需要此 jar 包时则不再从远程仓库下载,因为本地仓库已经存在了,可以将本地仓库理解为缓存,有了本地仓库就不用每次从远程仓库下载了。
本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找。默认本地仓库位置在 ${user.dir}/.m2/repository,${user.dir}表示windows 用户目录。
远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网内。
中央仓库 :在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。
3.2 本地仓库的配置
这里提供一个本地仓库:https://pan.baidu.com/s/1ZBFwhBBt6RaxU_MQYP8Afw
,提取码:zsv7
下载后解压在到一个没有中文的路径下,比如D盘根目录下,然后告诉安装的Maven:本地仓库路径。
打开安装的Maven路径,打开conf/settings.xml文件,配置如下:
3.3 setting.xml配置文件
maven 仓库地址、私服等配置信息需要在 setting.xml 文件中配置,分为全局配置和用户配置。
在 maven 安装目录下的有 conf/setting.xml 文件,此 setting.xml 文件用于 maven 的所有 project项目,它作为 maven 的全局配置。
如需要个性配置则需要在用户配置中设置,用户配置的 setting.xml 文件默认的位置在:${user.dir}/.m2/settings.xml 目录中,${user.dir} 指windows 中的用户目录。
maven会先找用户配置,如果找到则以用户配置文件为准,否则使用全局配置文件。
4、Maven工程
4.1 创建工程
创建一个普通Java工程命令:
mvn archetype:generate -DgroupId=cn.klb -DartifactId=maven_helloworld -Dversion=1.1.0 -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeCatalog=internal
创建一个JavaWeb工程命令:
mvn archetype:generate -DgroupId=cn.klb -Dversion=1.1.0 -DartifactId=maven_javaweb -DarchetypeArtifactId=maven-archetype-webapp
命令参数:
mvn archetype:generate
:新建一个Maven工程;
-DgroupId=cn.klb
:工程的公司和项目(有关Java工程命名规则自行百度);
-DartifactId=maven_helloworld
:工程的名字;
-Dversion=1.1.0
:工程的版本号;
-DarchetypeArtifactId=maven-archetype-quickstart
:工程的模板,不同模板创建出来的结构不太一样。
4.2 工程的目录结构
作为一个 Maven 工程,它的 src目录和 pom.xml 是必备的。
5、Maven常用命令
5.1 compile
maven 工程的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target目录下。
cmd执行命令:mvn compile
查看我们的工程文件夹:
可见,字节码文件已经生成,编译完成。
5.2 test
maven 工程的测试命令 mvn test,会执行src/test/java下的单元测试类。
cmd 执行 mvn test 执行 src/test/java 下单元测试类,下图为测试结果,运行 1 个测试用例,全部成功。
5.3 clean
maven 工程的清理命令,执行 clean 会删除 target 目录及内容。
5.4 package
maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于web 工程打成war包。
5.5 install
maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库。
执行后,打开本地仓库,就发现jar包已经放到里面了。
从运行结果中,可以看出:当后面的命令执行时,前面的操作过程也都会自动执行。
5.6 指令的生命周期
Maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。
6、IDEA开发Maven项目
跟Tomcat一样,要idea来开发maven项目,那么就得告诉idea我的maven安装目录。
6.1 配置
6.2 创建Maven工程
第一步,根据web工程模板创建一个web工程:
第二步,填写工程信息:
第三步,请确认工程信息,直接next即可;
等待控制台显示创建成功:
创建完成后工程的目录结构:
因为这个模板创建的项目不完整,把工程补齐:
补齐后如下:
6.3 测试
pom.xml导入必要的jar包坐标:
<?xml version="1.0" encoding="UTF-8"?>
<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>cn.klb</groupId>
<artifactId>maven_web_helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>maven_web_helloworld Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>maven_web_helloworld</finalName>
<plugins>
<!--配置tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
在java目录下,建一个cn.klb包,然后新建一个类:
package cn.klb.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: Konglibin
* @Description:
* @Date: Create in 2020/3/13 18:54
* @Modified By:
*/
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/hello.jsp").forward(req,resp);
}
}
web.xml:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>cn.klb.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
webapp文件夹新建两个jsp:
index.jsp:
<%--
Created by IntelliJ IDEA.
User: Meumax
Date: 2020/3/13
Time: 19:00
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>欢迎页面!</h3>
<a href="/hello">请点击</a>
</body>
</html>
hello.jsp
<%--
Created by IntelliJ IDEA.
User: Meumax
Date: 2020/3/13
Time: 19:13
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>来啦</title>
</head>
<body>
<h3>来啦老弟~</h3>
</body>
</html>
启动tomcat
启动后即可在浏览器输入http://localhost:8080/测试结果。
7、小结
常用的Maven指令:compile、clean、test、package、install。
在 pom.xml 中定义坐标,内容包括:groupId、artifactId、version,详细内容如下:
<!--项目名称,定义为组织名+项目名,类似包名-->
<groupId>cn.klb</groupId>
<!-- 模块名称 -->
<artifactId>maven_web_helloworld</artifactId>
<!-- 当前项目版本号,snapshot 为快照版本即非正式版本,release为正式发布版本 -->
<version>1.0-SNAPSHOT</version>
<!--打包类型-->
<!--jar:执行 package 会打成 jar 包-->
<!--war:执行 package 会打成 war 包-->
<!--pom :用于 maven 工程的继承,通常父工程设置为 pom-->
<packaging>war</packaging>
pom.xml 是 Maven 项目的核心配置文件,位于每个工程的根目录,基本配置如下:
<project > :文件的根节点 .
<modelversion > : pom.xml 使用的对象模型版本
<groupId > :项目名称,一般写项目的域名
<artifactId > :模块名称,子项目名或模块名称
<version > :产品的版本号 .
<packaging > :打包类型,一般有 jar、war、pom 等
<name > :项目的显示名,常用于 Maven 生成的文档。
<description > :项目描述,常用于 Maven 生成的文档
<dependencies> :项目依赖构件配置,配置项目依赖构件的坐标
<build> :项目构建配置,配置编译、运行插件等。