Maven
为什么是 Maven
-
一个项目就是一个工程
-
项目中使用 jar 包,需要“复制”、“粘贴”项目的lib中
-
jar 包需要的时候每次都要自己准备好或到官网下载
-
jar 包版本不一致的风险
-
一个 jar 包依赖其他的 jar 包需要自己手动的加入到项目中
概述
Apache Maven 是一个软件项目管理和依赖管理工具。基于项目对象模型(POM:Project Object Model)的概念,Maven 可以从一个中心信息块管理项目的构建、报告和文档。
无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷开发,Maven 都能大显身手。
以下是使用 Maven 构建项目的各个环节
环节 | 描述 |
---|---|
清理clean | 将以前编译得到的旧文件class字节码文件删除 |
编译compile | 将java源程序编译成class字节码文件 |
测试test | 自动测试,自动调用junit程序 |
报告report | 测试程序执行的结果 |
打包package | 动态Web工程打War包,java工程打jar包 |
安装install | Maven特定的概念-----将打包得到的文件复制到“仓库”中的指定位置 |
部署deploy | 将动态Web工程生成的war包复制到Servlet容器下,使其可以运行 |
核心功能【重点】
-
更简单的构建过程
-
统一构建系统
-
优质工程咨询
-
透明地迁移到新功能
-
最佳实践开发指南
Maven 环境配置
下载
下载链接:Maven – Download Apache Maven
安装
Maven 目录
目录 | 描述 |
---|---|
bin | 包含 mvn 的一些可执行程序 |
boot | 包含 plexus-classworlds 类加载器的框架 |
conf | 包含 settings.xml 在内的配置文件 |
lib | Maven 运行时所需要的 Java 类库 |
LICENSE、NOTICE、README.txt | 简要介绍 |
配置环境变量
配置 Maven 仓库
Maven 使用仓库管理各种 jar 包和插件。
Maven 仓库分为:本地仓库(local)、远程仓库(remote)两大类
检索顺序:先检索本地仓库 --> 再检索远程公共仓库 --> 最后检索中央仓库
本地仓库
本地电脑中的仓库。默认位置为:${user:home}/.m2/repository
一般需要修改此位置为非 C 盘下。
远程仓库
远程仓库又包括:中央仓库 + 私服 + 其它公共远程仓库 (比如阿里、163等)。
中央仓库
中央仓库是maven自带的远程仓库,默认地址:Central Repository:,由于默认中央仓库的服务器在国外,下载会比较慢,一般需要配置使用国内的公共远程仓库作为中央仓库镜像。注意配置了中央仓库镜像就不再走默认中央仓库。
私服
私服是架设在本机或者局域网中的一种特殊的远程仓库,通过私服可以方便的管理其它所有的外部远程仓库。
-
节省自己的外网带宽
-
加速 Maven 构建
-
部署第三方控件
-
提高稳定性
-
降低中央仓库的负荷
修改配置
在 maven 的 conf 目录中找到 settings.xml 文件中进行配置
<!--第一个位置在根节点settings下添加本地仓库位置--> <localRepository>F:/m2/repository</localRepository> <!--第二个位置,在mirrors节点下添加 中央仓库镜像--> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> <!--第三个位置,在 profiles 节点下添加 jdk 版本全局配置,因为默认为1.5--> <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> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </profile>
Idea 配置 Maven
更新 Maven 本地仓库
IDEA 创建 Maven 项目
Maven 入门
Maven 项目目录结构
约定大于配置:能使用约定好的方式,就不要配置。
手动创建目录结构:
maven_project_name --src --main --java --com --fc Hello.java --resources --webapp --WEB-INF --web.xml --test --pom.xml
目录说明
参数 | 描述 |
---|---|
maven_project_name | maven 项目名 |
src | java 源文件目录 |
main | 项目主体目录 |
java | 源代码目录 |
resources | 资源目录 |
webapp | web 项目目录 |
test | 项目测试目录 |
pom.xml | maven项目核心配置文件 |
pom.xml 配置文件
<?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> <!--组织id:公司名--> <groupId>com.fc</groupId> <!--项目名或者模块名--> <artifactId>testmaven</artifactId> <version>1.0-SNAPSHOT</version> <!--打包形式 jar包--> <packaging>jar</packaging> <!--依赖--> <dependencies> <!--junit单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>
使用命令创建(了解)
mvn archetype:generate -DgroupId=com.fc.maven -DartifactId=maven02 -DinteractiveMode=false -DarchetypeCatalog=internal
Maven 常见命令
Maven 的另一个核心功能是项目构建。
构建包括:清理、编译、测试、打包、安装、部署、运行等。这些过程都可以使用Maven命令来完成。
每个 maven 命令都可以通过对应的插件来完成。
clean
# 清理(删除)编译的文件 mvn clean # 使用插件 maven-clean-plugin:2.5:clean
compile
# 编译主目录的文件 mvn compile # 使用插件 maven-resources-plugin:2.6:resources maven-compiler-plugin:3.1:compile
test
# 编译并运行test目录的代码 mvn test # 使用插件 maven-resources-plugin:2.6:resources maven-compiler-plugin:3.1:compile maven-resources-plugin:2.6:testResources maven-compiler-plugin:3.1:testCompile maven-surefire-plugin:2.12.4:test
package
# 打包项目,jar包或war包 mvn package # 使用插件 maven-resources-plugin:2.6:resources maven-compiler-plugin:3.1:compile maven-resources-plugin:2.6:testResources maven-compiler-plugin:3.1:testCompile maven-surefire-plugin:2.12.4:test maven-jar-plugin:2.4:jar
install
# 安装到仓库 mvn install # 使用插件 maven-resources-plugin:2.6:resources maven-compiler-plugin:3.1:compile maven-resources-plugin:2.6:testResources maven-compiler-plugin:3.1:testCompile maven-surefire-plugin:2.12.4:test maven-jar-plugin:2.4:jar maven-install-plugin:2.4:install
其他命令
# 部署,部署到私服 mvn deploy # 运行 mvn tomcat:run
Maven 构建生命周期
-
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。Clean生命周期一共包含了三个阶段:
-
pre-clean 执行一些需要在clean之前完成的工作
-
clean 移除所有上一次构建生成的文件
-
post-clean 执行一些需要在clean之后立刻完成的工作
-
-
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
-
Site Lifecycle 生成项目报告,站点,发布站点。
-
pre-site 执行一些需要在生成站点文档之前完成的工作
-
site 生成项目的站点文档
-
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
-
site-deploy 将生成的站点文档部署到特定的服务器上
-
Maven POM 文件
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元。pom.xml是Maven的核心配置文件,包含了项目的基本信息,用于描述项目如何构建,声明项目的 jar 包依赖等等。
每一个项目都有一个 POM 文件。POM 文件即 pom.xml,应该放在项目的根目录下。一个项目如果分为多个子项目,一般来讲,父项目有一个 POM 文件,每一个子项目都有一个POM文件。在这种结构下,既可以一步构建整个项目,也可以各个子项目分开构建。
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
POM 中可以指定以下配置:
-
项目依赖
-
插件
-
执行目标
-
项目构建 profile
-
项目版本
-
项目开发者列表
-
相关邮件列表信息
基本的 pom.xml 配置文件
<?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"> <!--maven版本--> <modelVersion>4.0.0</modelVersion> <!--组织id:公司名--> <groupId>com.fc</groupId> <!--项目名或者模块名--> <artifactId>testmaven</artifactId> <!--版本号--> <version>1.0-SNAPSHOT</version> <!--打包形式 jar包--> <packaging>jar</packaging> </project>
【注意】所有 POM 文件都需要 project 元素和三个必需的标签:groupId,artifactId,version。这个必须元素叫做坐标(GAV)
Maven 引入外部依赖
Maven 仓库:
引入多个依赖只需在 dependencies 标签下声明对应的 dependency 标签即可
<!--依赖--> <dependencies> <!--junit单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
【注意】Scope依赖范围:
compile(编译范围) compile是默认的范围,会被打包。
provided(已提供范围) provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。它们不是传递性的,也不会被打包。
runtime(运行时范围) runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。
test(测试范围)只有在测试编译和测试运行阶段可用。
system(系统范围)必须显式的提供一个对于本地系统中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> <artifactId>Maven_Project</artifactId> <groupId>com.fc</groupId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <!--自定义依赖版本--> <spring.version>5.3.3</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <!--使用自定义的依赖版本--> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <!--使用自定义的依赖版本--> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <!--使用自定义的依赖版本--> <version>${spring.version}</version> </dependency> </dependencies> </project>
在 Maven 项目中使用 Web 组件
<build> <!--添加插件--> <plugins> <!--添加Tomcat插件--> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <!--Tomcat相关配置--> <configuration> <port>8080</port> <!--编码集--> <uriEncoding>UTF-8</uriEncoding> <!--访问路径--> <path>/testMaven</path> </configuration> </plugin> </plugins> </build>
pom.xml 配置文件【重点】
<?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.fc</groupId> <artifactId>maven_project</artifactId> <version>1.0-SNAPSHOT</version> <!--因为是web项目,所以打包方式声明为war--> <packaging>war</packaging> <!--添加jar包依赖--> <dependencies> <!--Servlet-api--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <!--声明此jar包的作用域为编译期--> <scope>provided</scope> </dependency> </dependencies> <build> <!--添加插件--> <plugins> <!--添加Tomcat插件--> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <!--Tomcat相关配置--> <configuration> <!--端口--> <port>8080</port> <!--编码集--> <uriEncoding>UTF-8</uriEncoding> <!--访问路径--> <path>/testMaven</path> </configuration> </plugin> </plugins> <resources> <!--需要设置打包的文件 特别是非java文件--> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> </resources> </build> </project>
【注意】使用时直接复制粘贴,修改groupId、artifactId、path等参数即可
Maven 相关命令【了解】
命令 | 描述 |
---|---|
mvn version | 显示当前版本信息 |
mvn compile | 编译源代码 |
mvn test-compile | 编译测试代码 |
mvn test | 运行测试 |
mvn site | 生成site |
mvn eclipse:eclipse | 生成eclipse项目 |
mvn idea:idea | 生成idea项目 |
mvn clean | 清除产生的项目 |
mvn package | 打包 |
mvn jar:jar | 只打jar包 |
mvn source:jar | 源码打包 |
mvn tomcat7:run | 在tomcat容器中运行web应用 |
mvn jetty:run | 调用Jetty插件的Run目标在Jetty Servlet容器中启动web应用 |
补充:Eclipse 操作 Maven
![Eclipse操作](http://bufferc.store/images/202202142048707.gif)