1.Maven简介
Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。是apache的一个顶级开源项目。 Maven基于约定优于配置的原则: 即使用最佳实践,减少配置。
Maven两大核心:
- 依赖管理: 依赖管理指的就是使用Maven来管理项目中使用到的jar包。Maven管理的方式就是:自动下载项目所需要的jar包,统一管理jar包之间的依赖关系。
项目构建: 这六个步骤就是一个项目的完整构建过程。
理想的项目构建是高度自动化,跨平台,可重用的组件,标准化的,使用maven就可以帮我们完成上述所说的项目构建过程。
2.Maven关键知识点
2.1.Maven仓库
Maven中的依赖管理就是用来管理项目中的jar包,而这些jar包存储在Maven仓库中。
默认的,本地所有Maven项目都共用一个本地仓库。本地仓库从中央仓库下载必要的构件。
Maven仓库分类:本地仓库 存放从中央仓库下载的依赖组件。 windows7默认地址:C:\user\xxx.m2\repository linux默认地址:~/.m2/repository
- 远程仓库 中央仓库:central repository(由Apache官方维护的组件库,组件可升级) 私有仓库(私服):机构自己搭建的远程仓库(适用于本机构内部各个项目组使用) 第三方公共库:比如国内阿里Maven镜像仓库
附录:Maven中央仓库地址:
2.2.Maven坐标
Maven通过坐标对jar包进行唯一标识。坐标通过3个元素进行定义,groupId、artifactId、version。
- groupId:组织标识,一般为域名倒置。
- artifactId:项目名或模块名,是当前项目中的唯一标识。
-
3.Maven的安装与配置
安装jdk环境:maven的运行需要依赖jdk。
- 下载maven。官网下载:http://maven.apache.org/download.cgi
- 将下载的maven压缩包直接解压到本地磁盘即可。
- 配置环境变量: M2_HOME: maven安装目录 Path:%M2_HOME%/bin
- 测试是否安装成功。命令行输入:mvn -v
本地仓库配置 Maven本地仓库默认地址为:C:\user\xxx.m2\repository。 也可以改变本地仓库地址。 maven安装目录 -> 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>E:\dev_software\repository</localRepository>
远程仓库配置 Maven远程仓库默认地址为:http://my.repository.com/repo/path。也可以改变远程仓库地址。 打开maven安装目录中的conf文件夹, maven安装目录 -> conf文件夹 -> settings.xml配置文件
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central</url>
</mirror>
4.Maven项目标准目录结构
一个Maven工程的目录结构,必须为下图所示:
下面使用记事本,手动创建一个Maven工程:首先,在磁盘上创建如下目录结构:
pom.xml文件:maven核心配置文件。项目对象模型(Project Object Model,POM)
<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.neusoft</groupId>
<artifactId>hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 这里添加项目依赖的jar包 -->
<dependencies>
</dependencies>
</project>
modelVersion:Maven2.0版本以上必须这样写。 groupId:组织标识,也是本地仓库中的路径。 artifactId:项目或模块名称,是当前项目中的唯一标识。 version:当前项目版本(snapshot:开发板;即不稳定版)。 packaging:当前项目打包格式(jar、war、pom)(默认jar) dependencies:配置项目依赖的jar包
- 在src/main/java文件夹中创建的 com.neusoft.hello.Hello.java 文件:
package com.neusoft.hello; public class Hello{ public static void main(String[] args){ System.out.println("hello world!"); } }
接下来,就可以使用下面的 Maven常用命令,来编译和运行此项目了。
5.Maven常用命令
编译:mvn compile 将java文件编译成class文件,必须在项目目录下运行该命令。
D:\hello>mvn compile
运行:mvn exec 执行main方法。
D:\hello>mvn exec:java -Dexec.mainClass="com.neusoft.hello.Hello"
打包:mvn package 将项目打包到target目录下。
- 安装:mvn install 打包到本地仓库。解决本地多个项目共用某个jar包的问题。
- 建立目录结构:mvn archetype:generate
- 清理:mvn clean 将项目根目录下的target目录删除。
单元测试:mvn test 执行src/test/java目录下的单元测试类。 注意:单元测试类名规范:XXXTest.java,并且要在pom.xml中依赖junit包。
6.在STS中使用maven
6.1.在STS中配置maven
在STS中打开 Window -> Preferences -> Maven -> Installations。
- 在 Installations 窗口中点击 “Add…” 按钮 ,选择 Maven 安装路径,然后点击 “Apply” 按钮。
再次选择:Windows –> Prefrences –> Maven –> User Settings –> Browse。选择maven安装路径下conf文件夹中的settings.xml ,然后点击 “Apply” 按钮。
6.2.在STS中创建maven工程
6.2.1.创建javaSE工程
在新建中选择maven工程,然后点击 “Next”:
- 将第一个选项选中,然后点击下一步
- 添加各种信息(包括坐标与版本,Packaging 处选择 jar),然后点击完成
pom.xml文件中添加jar包依赖。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.neusoft</groupId> <artifactId>hello1</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <!-- 这里添加jar包依赖(比如:添加mysql驱动包) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies> </project>
基于 Maven 的 javaSE 工程就创建好了。之后,就可以在 src/main/java 下创建包和类了。
6.2.2.创建javaWeb工程
在新建中选择maven工程,然后点击 “Next”:
- 将第一个选项选中,然后点击下一步
- 添加各种信息(包括坐标与版本,Packaging 处选择 war),然后点击完成
- 打开 src -> main -> webapp 文件夹,手动添加 WEB-INF 文件夹和 web.xml 配置文件。
pom.xml文件中添加jar包依赖。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.neusoft</groupId> <artifactId>hello1</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0</version> <scope>provided</scope> </dependency> <!-- 其他jar包依赖 --> ... ... </dependencies> </project>
基于 Maven 的 javaEE 工程就创建好了。之后,就可以在 src/main/java 下创建Servlet了。
package com.neusoft; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; @WebServlet("/hello") public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); out.print("hello..."); out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
7.Maven中的jdk版本配置
Maven默认的jdk版本配置是1.5,所以在开发中,一般都需要修改jdk版本的配置。 可以进行全局配置,也可以进行局部配置。
7.1.局部配置jdk版本
配置局部的 jdk 版本只针对具体某个项目进行配置,在当前项目的 pom.xml 文件中添加build元素
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.neusoft</groupId> <artifactId>hello2</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <!-- 第一种方式 --> <!-- build标签用于编译设置 --> <build> <plugins> <!-- 设置jdk版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>utf-8</encoding> </configuration> </plugin> </plugins> </build> <!-- 第二种方式 --> <!-- properties标签用于设置Maven属性,或自定义属性 --> <!-- <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> --> </project>
7.2.全局配置jdk版本
打开 settings.xml 配置文件,找到 profiles 这个标签,在这里添加如下代码:
<profiles> <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> ... </profiles>
8.Maven中的依赖
8.1.依赖范围
maven 项目在不同的阶段引入到classpath中的依赖是不同的。常用依赖范围有四种:
compile:编译依赖范围,在编译,测试,运行时都需要。
比如:log4j(常用日志jar包)- test: 测试依赖范围,测试时需要。编译和运行不需要。
比如:junit(常用测试jar包) - runtime: 运行时依赖范围,测试和运行时需要。编译不需要。
比如:jdbc驱动jar包 - provided:已提供依赖范围,编译和测试时需要。运行时不需要。
比如:servlet-api
在Maven中,使用 scope 标签来表示依赖范围。
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<!-- 通常情况下,runtime都使用compile替代 -->
<scope>runtime</scope>
</dependency>
</dependencies>
8.2.传递依赖
在 Maven 的 pom.xml 中书写的 jar 包中,如果存在直接依赖关系,或者是传递依赖关系,那么Maven也会将所依赖的jar包一同导入。 比如: A -> B: A包依赖B包,这是直接依赖。 A -> B -> C: A包依赖B包,B包又依赖C包,这是传递依赖。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.neusoft</groupId>
<artifactId>elm</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
</project>
注意: jackson 需要三个包:core、databind、annotations。但是,在pom.xml中只写了一个依赖:core 和 databind。 那是因为,databind 包依赖于 core 和 annotations ,所以 Maven 也会将 core 和 annotations 包一同导入。
作业:
- Maven 是什么,说出5点主要功能?
- 项目为什么选用 Maven 进行构建?
- 简述Maven 规约是什么(默认约定的工程目录结构)?
- 简述Maven 常用命令?
- 简述/Maven 坐标的含义:groupId 、artifactId 、version 、packaging?
- Maven中
中属性有哪些,各个属性的功能是什么?