一、maven的基本概念
maven是跨平台的项目管理工具,主要服务于基于java的项目构建,依赖管理和项目信息管理
二、下载和安装
1、下载
地址:http://maven.apache.org/download.cgi
2、安装
下载上面压缩包
解压上面的压缩包,可得
bin:含有mvn 的运行脚本
boot:含有plexus-classworlds-2.5.2.jar类加载器框架
config:含有settings.xml配置文件
lib:含有maven运行时所需的java类库
2、首先要确定电脑上已经安装了jdk并配置好了环境变量
3、设置系统环境变量
注意:解压缩后文件夹名一定要是apache-maven-3.5.4
4、设置环境变量,将MAVEN_HOME添加到path中
5、检测
在控制台上输入 mvn -v命令,若显示了maven的版本,则安装成功
三、快速入门
maven项目的目录约定
项目名
|——src
|——main
|——java:存放项目的java文件,从包开始
|——resource:存放项目资源文件,即项目所需jar包
|——test
|——java:存放所有测试.java文件,如Junit测试类
|——resource:存放项目资源文件,即项目所需jar包
|——target:项目输出位置
2、pom.xml文件
和src放在同一目录下,用于标识该项目是一个maven项目
示例:
<?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>
<!--包名-->
<groupId>com.imooc.maven01</groupId>
<!--项目中的某一个模块,默认命名方式为 项目名-模块名-->
<artifactId>maven01-model</artifactId>
<version>1.0-SNAPSHOT</version>
<!--dependencies指项目依赖的jar包,当项目编译时,需要某些jar包,则会从该标签下寻找,若里面有,则会先从本地仓库中加载该jar包,否则会从在线仓库中寻找-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
具体项目见E:\maven\maven01
四、maven中常用的命令
mvn -v:查看mvn版本
mvn compile:编译项目,,当执行这个命令时,会生成target包
mvn test:执行测试类
mvn pakcage:将项目打包成jar包,并放在target文件夹下
mvn install:将jar包加入本地仓库中
mvn clean:将target文件夹删除
五、自动创建项目目录骨架
用命令mvn archetype:generate接着按照提示输入相应的值
或者命令mvn archetype:generate -D后面直接列出所有值,比如-D groupId -DartifactId ......
六、maven的一些相关概念
坐标:构件的唯一标识符,pom.xml文件中的groupId、artifactId、version(快照的版本)就是构件的坐标,其中groupId最好写成项目名(包名如com.imooc.maven01,其中maven01为项目名),artifactId最好写成项目-模块名
仓库:就是存放了maven的核心插件和可供下载的jar包,分为本地仓库和远程仓库,当我们所需要的jar包在本地仓库中没有时,会从远程仓库中下载到本地仓库
默认的远程仓库可在
maven-model-builder-3.5.4-jar包(可将其先解压)的apache\maven\model\pom-4.0.0.xml文件中
<repository>
<id>central</id>
<name>Central Repository</name>
//地址
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
就是远程仓库的配置,由于maven的远程仓库都在国外,所以访问的时候可能很慢,因此可以为该远程仓库设置镜像仓库
镜像仓库:就是国外的远程仓库的一个映射,方便用户访问
设置镜像仓库
maven\apache-maven-3.5.4\conf\settings.xml中配置
如:
<mirror>
<id>maven.net.cn</id>
<!-- 为远程仓库的id -->
<mirrorOf>central</mirrorOf>
<name>central mirror in china</name>
<url>http://maven.net.cn/content/groups/public</url>
</mirror>
本地仓库:从远程仓库上下载的jar包默认会放在,可以手动修改本地仓库的位置
通过修改settings.xml中配置
<localRepository>E:\maven\repo</localRepository>可将本地仓库指定为E:\maven\repo
七、在eclipse中安装maven插件
1、在window——>preferences中查看是否有maven,若有则已经安装maven插件
2、由于maven需要用到jdk,而eclipse默认是在jre上运行,所以需要配置一下
点击Add按钮——>添加jdk安装目录即可,然后勾选
3、在maven中配置
——>即自定义仓库中的settings.xml文件及仓库位置
8、maven插件及其生命周期
一个完整的项目构建过程包括清理、 编译、测试、打包、 集成测试、验证、部署等步骤,maven从中抽取出一套完善的易于扩展的生命周期,maven的生命周期是抽象的, 其中具体任务的是由插件来完成,maven为大多数构建任务编写并绑定了插件,如针对编译的插件:maven-compiler-plugin。用户也可自行配置或编写插件。
maven定义了三套生命周期,clean、defaule和site,其中每个生命周期又包含了一些阶段(phrase),每个生命周期之间是相互独立的, 但每个生命周期的阶段都是按顺序执行,且后面的阶段依赖于前面的阶段,执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase。
clean生命周期包括以下阶段
pre-clean:执行清理前的工作
clean:清理上一次构建生成的所有文件
post-clean:执行清理后的工作
default生命周期
default生命周期是最核心的,它包含了构建项目时需要执行的所有步骤,包括以下阶段
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources :复制和处理资源文件到target目录,准备打包;
- compile :编译项目的源代码;
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile :编译测试源代码;
- process-test-classes
- test :运行测试代码;
- prepare-package
- package :打包成jar或者war或者其他格式的分发包;
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install :将打好的包安装到本地仓库,供其他项目使用;
- deploy :将打好的包安装到远程仓库,供其他项目使用;
1 . 3 site生命周期,包括以下阶段
pre-site:执行生成站点前的工作
site:生成项目的站点文档
post-site:执行生成站点后的工作
deploy-site:将生成的项目站点文档发布到服务器上
maven插件
插件的目标
一个插件通常可以完成很多任务,每一个任务就叫做插件的一个目标
将插件绑定到生命周期上
生命周期是抽象的,具体的任务要通过插件去完成,而这一过程是通过将插件目标绑定到生命周期的具体阶段来完成
如:
<phase>package</phase>
//具体见插件介绍
<goals>
<goal>jar-no-fork</goal>
</goals>
插件见网址:http://maven.apache.org/plugins/index.html
使用:比如
用于将项目打包成源码
在pom.xml中的配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
//在执行哪个阶段时使用该插件
<phase>package</phase>
//具体见插件介绍
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
9、pom.xml详解
1、什么是pom.xml文件
1、第一种定义:pom.xml主要描述maven的运行时环境、坐标、依赖关系、开发者需要遵循的规则、缺陷管理系统、组织和licenses,以及其他与 项目有关的因素,是项目级别的配置文件。
POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml。作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。事实上,在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。
2、标签详解
<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">
<!--pom文件的版本,固定-->
<modelVersion>4.0.0</modelVersion>
<!--坐标-->
<!--反写公司网址+项目名-->
<groupId>com.imooc.maven03</groupId>
<!--项目名+模块名-->
<artifactId>model</artifactId>
<!-- 项目版本
0:表示大版本号
0:分支版本号
1:小版本号
种类:
1、SNAPSHOT:快照版本
2、alpha:内测
3、beta:公测
Release:稳定
GA:正式发布
-->
<version>0.0.1-SNAPSHOT</version>
<!--项目打包方式-->
<packaging>jar</packaging>
<!--项目描述名-->
<name>model</name>
<!--项目地址-->
<url>http://maven.apache.org</url>
<!--项目描述-->
<description></description>
<!--项目开发者-->
<developers></developers>
<!--项目组织-->
<organization></organization>
<!--开源项目许可-->
<licenses></licenses>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--项目依赖关系-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!--指这个jar包的依赖范围,比如junit jar包,若范围为test,则在main中不能使用这个jar包-->
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
在编写maven项目时,若要使用某个框架,则要将该框架的jar包引入classpath中,而在maven中为我们提供了三种classpath,分别为编译、测试、运行,而范围是用来控制依赖与三种classpath的关系,如 <scope>test</scope> 表明该依赖在测试时有效
scope的取值6个
compile:指该依赖在三种classpath上都有效
provided:容器或JDK已提供范围,表示在JDK或者容器中已经提供该依赖,只在编译和测试时加载或使用,在打包时不会包含在目标包中,最常见的是j2ee规范相关的servlet-api和jsp-api等jar包,一般由servlet容器提供,无需在打包到war包中,如果不配置为provided,把这些包打包到工程war包中,在tomcat6以上版本会出现冲突无法正常运行程序(版本不符的情况)。
runtime:一般是运行和测试环境使用,编译时候不用加入classpath,打包时候会打包到目标包中。一般是通过动态加载或接口反射加载的情况比较多。也就是说程序只使用了接口,具体的时候可能有多个,运行时通过配置文件或jar包扫描动态加载的情况。典型的包括:JDBC驱动等。
test:测试范围,一般是单元测试场景使用,在编译环境加入classpath,但打包时不会加入,如junit等。
system:系统范围,与provided类似,只是标记为该scope的依赖包需要明确指定基于文件系统的jar包路径。因为需要通过systemPath指定本地jar文件路径,所以该scope是不推荐的。如果是基于组织的,一般会建立本地镜像,会把本地的或组织的基础组件加入本地镜像管理,避过使用该scope的情况。
import:在 <dependencyManagement>这个标签中的<dependency>中使用
依赖传递
若项目A依赖项目B,项目B依赖项目C,则项目A依赖项目C
例如:依赖于
依赖于
则若在项目的pom文件中添加对项目
的依赖,则可实现它们之间的依赖关系
<dependency>
<groupId>com.imooc.maven03</groupId>
<artifactId>maven03-dge</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
若此时在项目的pom.xml文件中添加对项目
的依赖,则可实现它们之间的依赖关系,但由于
项目对项目
的依赖,则项目
对项目
也有依赖,
即
若不想让对
有 依赖,可排除依赖,如
<dependency>
<groupId>com.imooc.maven03</groupId>
<artifactId>maven03-nage</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.imooc.maven03</groupId>
<artifactId>maven03-dge</artifactId>
</exclusion>
</exclusions>
</dependency>
即
依赖冲突
即若A依赖于B依赖于C,且A、B同时依赖于一个版本不同的jar包,则此时C中的该jar包是哪个版本,这就是依赖冲突
有两条原则
1、短路优先:即依赖路径短的优先,如A——>B——>C,则C中的jar包和B版本相同,因为B的依赖路径更短
2、谁先声明谁优先:即若C同时依赖于A、B,则A、B谁在pom.xml文件中先声明,C的jar包就和谁版本相同
如:
上面那个例子
如
<dependency>
<groupId>com.imooc.maven03</groupId>
<artifactId>maven03-dge</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.imooc.maven03</groupId>
<artifactId>maven03-nage</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
则
依赖聚合和依赖继承
依赖聚合:即当有多个项目需要放入仓库中时,一个一个编译、打包、install太麻烦了,可以将多个居合道一个项目中进行
新建一个
配置文件
<packaging>pom</packaging>
<modules>
<module>../maven03-dge</module>
<module>../maven03-nage</module>
<module>../maven03-shanji</module>
</modules>
依赖继承:当多个项目都继承一个jar包时, 每个项目中的配置文件都写未免有些重复,因此使用依赖继承,新建一个项目作为父模块, 让其他子模块去继承它,由于它不执行,所以不需要main和test目录
如:
父模块pom.xml
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>3.8.1</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
子模块
<parent>
<groupId>com.imooc.maven03</groupId>
<artifactId>maven03-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../maven03-parent/pom.xml</relativePath>
</parent>
如何构建WEB项目
1、新建一个maven项目
选中webapp模板
2、创建好之后,会报错,因为缺少servlet依赖,所以需导入,在maven的仓库中搜索servlet,并将给定的依赖配置复制到pom.xml文件中
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
3、由于此时src/main中没有java文件夹并且src下没有test文件夹,所以需创建
4、将classes文件的存放位置设置为target文件夹
右击项目——>选中build path——>source——>
若为这样既可
5、将该项目设置为web项目
右击项目——>properties——>Project Facets——>
6、设置部署中不含test文件夹
删去test文件夹既可
7、在pom.xml中配置tomcat插件,以便打包时将该项目发布到tomcat上
tomcat插件:在tomcat官网
pom.xml配置
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
说明:此插件只用于tomcat6/7,不用于tomcat8
8、测试
将该项目打包,即执行 clean package命令,接着访问该项目,看是否能访问到,即地址栏上输入如: