文章目录
1. Maven 的概念
Maven 是一个项目管理工具
2. Maven 的作用
- Maven 可以自动导入 jar 包
- Maven 可以编译代码
- Maven 可以自动运行单元测试
- Maven 可以打包项目,部署项目,生成 Web 站点
3. Maven 的依赖管理
Maven 的依赖管理就是 Maven 工程对 jar 包的管理过程
传统的 WEB 项目中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大。
而在 Maven 开发的项目中,不直接将 jar 包导入到工程中,而是通过在 pom.xml 文件中添加所需 jar 包的坐标,在需要用到 jar 包的时候,只要查找 pom.xml 文件,再通过 pom.xml 文件中的坐标,到一个专门用于存放 jar 包的仓库中根据坐标从而找到这些 jar 包,再把这些 jar 包拿去运行。
4. Maven 的安装
4.1 Maven 的下载
-
进入 Maven 官网
https://maven.apache.org/
-
点击 Download
-
点击 Binary zip archive 后的 link 下载
4.2 Maven 的安装
直接解压到一个路径下即可
4.3 Maven 的目录结构
-
bin:存放了 maven 的命令
-
boot:存放了一些 maven 本身的引导程序,如类加载器等
-
conf:存放了 maven 的一些配置文件,如 setting.xml 文件
-
lib:存放了 maven 本身运行所需的一些 jar 包
4.4 Maven 的环境变量
变量名:Maven_HOME
变量值:D:\apache-maven-3.5.2
变量名:Path
变量值:%Maven_HOME%\bin
至此我们的 Maven 软件就可以使用了,前提是你的电脑上之前已经安装并配置好了 JDK。
找开 cmd 命令,输入 mvn –v 命令,如果显示 Maven 和 Java 的版本信息,则配置成功。
5. Maven 仓库
5.1 Maven 仓库的分类
- 本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找
- 远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载
- 中央仓库:在 Maven 软件中内置一个远程仓库地址
http://repo1.maven.org/maven2
,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。
5.2 Maven 本地仓库的配置
-
将 “repository.rar” 解压至 D:\repository 目录下
-
在 MAVE_HOME/conf/settings.xml 文件中配置本地仓库位置
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> --> <localRepository>D:\repository\maven_repository</localRepository>
6. Maven 项目标准目录结构
Maven 项目的目录结构如下:
进入 src 目录后,我们发现它里面的目录结构如下:
-
src/main/java —— 存放项目的.java 文件
-
src/main/resources —— 存放项目资源文件,如 spring, hibernate 配置文件
-
src/test/java —— 存放所有单元测试.java 文件,如 JUnit 测试类
-
src/test/resources —— 测试资源文件
-
target —— 项目输出位置,编译后的 class 文件会输出到此目录
-
pom.xml——maven 项目核心配置文件
注意:如果是普通的 java 项目,那么就没有 webapp 目录。
7. Maven 的常用命令
我们可以在 cmd 中通过一系列的 maven 命令来对我们的 maven 工程进行编译、测试、运行、打包、安装、部署。
打开命令提示符,输入以下命令,进入项目 :
cd maven项目路径
7.1 compile
mvn compile
compile 是 maven 工程的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target 目录下。
7.2 clean
mvn clean
clean 是 maven 工程的清理命令,执行 clean 会删除 target 目录及内容。
7.3 test
mvn test
test 是 maven 工程的测试命令 mvn test,会执行 src/test/java 下的单元测试类。
7.4 package
mvn package
package 是 maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war 包。
7.5 install
mvn install
install 是 maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库。
8. Maven 的生命周期
maven 对项目构建过程分为三套相互独立的生命周期,这三套生命周期分别是:
-
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
-
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
-
Site Lifecycle 生成项目报告,站点,发布站点。
9. Maven 的概念模型
-
项目对象模型 (Project Object Model)
每个 maven 工程都有一个 pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、
插件目标等。
-
依赖管理系统(Dependency Management System)
通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理。
比如:项目依赖 junit4.9,通过在 pom.xml 中定义 junit4.9 的依赖即使用 junit4.9:
<!-- 依赖关系 --> <dependencies> <!-- 此项目运行使用 junit,所以此项目依赖 junit --> <dependency> <!-- junit 的项目名称 --> <groupId>junit</groupId> <!-- junit 的模块名称 --> <artifactId>junit</artifactId> <!-- junit 版本 --> <version>4.9</version> <!-- 依赖范围:单元测试时使用 junit --> <scope>test</scope> </dependency> </dependencies>
-
一个项目生命周期(Project Lifecycle)
使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些
过程规范为一个生命周期
10. IDEA 集成 Maven 插件
10.1 IDEA 的 Maven 配置
-
打开 File -> Settings -> Build, Execution, Deployment -> Build Tools -> Maven
-
在 Maven home directory 后配置本地已经安装好的 Maven 目录
D:\apache-maven-3.5.2
-
在 User setting files 后指定 settings 配置文件路径
D:\apache-maven-3.5.2\conf\settings.xml
-
点击 Runner,在 VM Options 后配置,这样在创建相关组件模板时就只基于本地已有的组件来创建,不再因网络延时而导致异常
-DarchetypeCatalog=internal
10.2 在 IDEA 中创建一个 Maven 的 Web 工程
-
打开 IDEA,选择 Create New Project
-
点击 Maven,勾选 Create from archetype
-
选择 idea 提供好的 maven 的 web 工程模板
org.apache.maven.archetypes:maven-archetype-webapp
-
点击 Next,填写项目信息
GroupId:com.zt //公司或组织的名称 ArtifactId:maven_web //项目名 version:1.0-SNAPSHOT //版本号
-
点击 Next,选择安装目录
-
点击 Finish
-
最终项目的目录结构还是不完整
-
手动添加 src/main/java 目录,右键 main 文件夹 New Directory,创建一个新的文件夹命名为 java,在新的文件夹 java 上右键 Make Directory as Sources Root
10.3 创建一个 Servlet
-
打开 mave_web 工程的 pom.xml 文件,添加坐标,导入 jar 包
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>
-
src/java/main 创建了一个 Servlet
package com.zt.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ServletDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
-
在 web.xml 中配置路径
<servlet> <servlet-name>ServletDemo1</servlet-name> <servlet-class>com.zt.servlet.ServletDemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo1</servlet-name> <url-pattern>/ServletDemo1</url-pattern> </servlet-mapping>
10.4 坐标的来源方式
添加依赖需要指定依赖 jar 包的坐标,但是很多情况我们是不知道 jar 包的的坐标,可以通过如下方式查询:
-
进入网站
https://mvnrepository.com/
-
搜索所需要的 jar 包
-
复制坐标即可
10.5 依赖范围
添加坐标时需要指定依赖范围,依赖范围包括:
- compile:编译、测试、运行都有效。默认范围,可以不写。
- provided:编译、测试、有效,运行时无效。防止和 tomcat 下 jar 冲突
- runtime:测试、运行有效。JDBC 驱动 jar 包
- test:测试有效。junit
10.6 添加 tomcat7 插件
在 pom 文件中添加如下内容:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--端口号-->
<port>80</port>
<!--访问路径-->
<path>/</path>
</configuration>
</plugin>
10.7 跳转网页练习
-
需求
在 ServletDemo1 中,完成跳转到 hello.jsp
-
实现步骤
-
打开 mave_web 工程的 pom.xml 文件,添加坐标,导入 jar 包,添加 tomcat7 插件
<?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>com.zt</groupId> <artifactId>maven_web</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>maven_web 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.7</maven.compiler.source> <maven.compiler.target>1.7</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</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>maven_web</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>80</port> <path>/</path> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
-
创建 ServletDemo1
package com.zt.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ServletDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("hello.jsp").forward(request,response); } }
-
在 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>ServletDemo1</servlet-name> <servlet-class>com.zt.servlet.ServletDemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo1</servlet-name> <url-pattern>/ServletDemo1</url-pattern> </servlet-mapping> </web-app>
-
创建 hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title></title> </head> <body> Hello World! </body> </html>
-
点击 Maven Projects,输入 Command line
tomcat7:run
-
打开浏览器,访问
http://localhost/ServletDemo1
-