Maven 是一个项目管理和构建工具
Maven是基于项目对象模型(pom),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
---------------------------------------------------------------------------
Maven :
Bin目录:包含mvn命令运行的脚本
Boot :包含一个类加载器的框架,maven用它来加载自己的类库
Conf :配置文件
Lib:maven运行依赖的类库
----------------------------------------------------------------------------
maven的目录结构:
Maven的目录结构
Src(源代码目录)
-main
-java
-package
-test
-java
-package
-resource(存放资源文件)
------------------------------------------------------------------------------------------
Maven中的基础知识
Mvn –v 查看maven版本
mvn -compile 编译
mvn -test测试
mvn -package 打包
Mvn –clean:y用来删除target(项目经过编译的字节码文件和测试报告)文件
mvn -install:安装jar到本地仓库中(可以将jar包发布到本地仓库中)
我们通过mvn –compile这个命令来编译源代码,如果在编译的过程中程序用到了其他的支持包,他会去pom.xml查找是否引入该依赖包的坐标,如果引入了,那么maven会先按照在dependency的坐标到本地仓库中去找,如果有,maven将会把该jar加载到该项目classpath中,如果没有找到该jar包,会按照网上的地址到maven的中央仓库去找并且下载,下载到本地仓库,供我们的项目进行使用,如果中央仓库也找不到就会报错
----------------------------------------------------------------------------------------------
常用的构建命令的框架
自动创建目录骨架(maven提供了archetype插件,用于创建符合maven规定的目录骨架)
创建目录的两种方式:
1. archetype:generate 按照提示进行选择
2. archetype:generate –DgroupId=组织名
-DartifactId=
-Dversion=版本号
-Dpackage=代码所存在的包
Maven中赋坐标和仓库:(所有构建通过坐标做为其唯一标识)
坐标:groupId,artifactId(项目名和模块名),version
仓库:用来管理项目的依赖,仓库分为本地仓库,远程仓库,maven所有的pom.xml都会继承一个超级的pom.xml(lib下的maven-model-builder.3.3.3.jar里面的pom.xml),url标签里的地址就是中央仓库的地址(包含了绝大多数的开源jar)
镜像仓库:(镜像就是a提供和b一样的功能)maven的中央仓库的服务器在国外,有时可能无法访问外网,但是国内有它的镜像仓库。
如何修改镜像仓库位置,
Maven 中Conf下的settings文件修改mirror
如何更改本地仓库的位置:修改settings,找到localRepository,把路径放进去即可
-------------------------------------------------------------------------------------------------
在eclispse中装maven插件,加载好插件后,建立一个maven项目,
步奏为new-maven project-next-选择。。。quickstart,next填写groupId,artifactId,version,
运行项目:选中Pom.xml右键run as maven build,在goals里面输入maven命令:如compile编译项目,package,打包项目(在项目的target目录下:class文件,测试报告,jar文件)
--------------------------------------------------------------------------------------------------
maven的生命周期
Maven的生命周期
完整的项目构建过程:清理,编译,测试,打包,集成测试,验证,部署
Maven生命周期:(定义了三套相互独立的生命周期,每个生命周期中又包括一些阶段,其阶段是有顺序的,且后面的阶段依赖前面的阶段,执行某个阶段时,其前面的阶段会顺序执行,但不会触发另外两套生命周期的任何阶段,例如运行compile这个阶段时,package,test会自动的执行)
Clean:清理项目
Default:构建项目
Site:生成项目站点
(1) clean清理项目
阶段:pre-clean 执行清理前的工作,
Clean 清理上一次构建生成的所有文件,
Post-clean执行清理后的工作,
(2)Default:构建项目
常用的阶段:compile,test,package,install(在运行package这个阶段时,是先运行compile和test阶段的)
(3) Site:生成项目站点
Pre-site:生成项目站点前要完成的工作
Site:生成项目站点文档
Post-site:生成项目站点后要完成的工作
Site-deploy:发布生成站点到服务----------------------------------------------------------------------------------
Pom.xml常用元素
<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><!-- 指定了当前pom的版本 -->
<!-- 坐标元素 -->
<groupId>com.imooc.hi</groupId><!-- 反写的公司网址+项目名 -->
<artifactId>hi</artifactId><!-- 项目名+模块名 例如 struts2_01 -->
<version>0.0.1-SNAPSHOT</version><!-- 版本号:一般由三个数字组成,第一个表示大版本号,第二个表示分支版本号,第三个表示小版本号 -->
<packaging>jar</packaging><!-- maven项目的打包方式,默认是jar -->
<name>hi</name><!-- 项目的描述名,产生项目文档时会使用 -->
<url>http://maven.apache.org</url><!-- 项目的地址 -->
<description></description><!-- 项目的描述 -->
<developers></developers><!-- 开发人员 -->
<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>
<scope>test</scope><!-- 依赖的范围,junit的jar只在我们的测试的依赖范围内有用 -->
<!--maven提供的三种classpath值:编译,测试,运行,
依赖的范围就是用来控制依赖与三种classpath的关系的,scope的属性compile(默认的,对于三种classpath都有效),test(测试范围有效,如junit),
runtime(测试和运行有效,如jdbc的驱动实现)
,system(编译和测试有效,与本地系统相关联),import(只用于dependencyManagement,表示从其他pom继承过来的依赖),
provided(编译和测试有效,如当我们构建一个web项目时,
编译和测试时可以依赖 servlet API,运行时并不会被加入,因为web容器已经包含servlet API),具体查看maven官网文档
-->
<optional></optional><!-- true 和false用来设置依赖是否可选,默认是false,如果是false,子项目默认是继承的 -->
<exclusions><!-- 排除依赖传递的列表 -->
<exclusion></exclusion><!-- 比如a依赖b,b依赖c,那么c对于a来说就是传递依赖,如果a不想依赖c,就可以使用这个标签 -->
<!-- -->
</exclusions>
</dependency>
</dependencies>
<!-- 依赖的管理,它不会被运行 ,不会被引入到实际的依赖中,主要是定义在父模块中,供子模块所继承用的,即公共的 -->
<dependencyManagement>
<dependencies></dependencies>
</dependencyManagement>
<!-- ,对构建的行为提供相应的支持-->
<build>
<!-- 插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<!-- 运行package命令时就能将source的源码打包,绑定source到default生命周期的package阶段 -->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 通常用于子模块中对父模块的pom的继承 -->
<!-- <parent></parent> -->
<!-- 是用来聚合运行多个的maven项,如果有很多的maven模块需要编译,就不需要一个个编译 -->
<modules></modules>
</project>
------------------------------------------------------------------------------------------------
依赖的范围scope
maven提供的三种classpath值:编译,测试,运行,
依赖的范围就是用来控制依赖与三种classpath的关系的,scope的属性compile(默认的,对于三种classpath都有效),test(测试范围有效,如junit),
runtime(测试和运行有效,如jdbc的驱动实现)
,system(编译和测试有效,与本地系统相关联),import(只用于dependencyManagement,表示从其他pom继承过来的依赖),
provided(编译和测试有效,如当我们构建一个web项目时,
编译和测试时可以依赖 servlet API,运行时并不会被加入,因为web容器已经包含servlet API),具体查看maven官网文档
------------------------------------------------------------------------------------------------------
依赖冲突:短路优先,例如:
A->B->C->X(jar)
A->D->X(jar)这个会优先解析
在依赖路径长度相同的情况下,先声明dependency先优先
------------------------------------------------------------------------------------------------------
聚合与继承
聚合:是用来聚合运行多个的maven项,如果有很多的maven模块需要编译,就不需要一个个编译
<modules>
<module>../hongxing-nage</module>
<module>../hongxing-bge</module>
<module>../hongxing-shanji</module>
</modules>
继承:
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
----------------------------------------------------------------------------------------------------
使用maven构建web项目:
使用maven新建maven项目,发布到tomcat中
- 首先在建立时选择maven-archetype-webapp
2. 导入servlet依赖
3. 检查classes文件的输出路径,项目输出路径在项目的target目录的classes(项目右键->bulidpath->config build path->source)
4. 将项目转换为web项目并添加文件夹构建maven目录结构:
项目右键->properties-project facets->dynamic web module(勾选)
5. 更改项目部署时的默认配置:
项目右键->properties->deployment Assemby-> (部署时不需要发布test文件,如果有,则移除)
6.添加tomcat
可以使用项目右键-run as –maven build..-tomcat:run(或 clean package)启动tomcat服务
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sj.webapp</groupId>
<artifactId>webDemo2</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>webDemo2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>webDemo2</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<!-- 在打包成功后使用tomcat:run来运行tomcat服务 -->
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>