Maven入门
maven入门
为什么使用maven
一个项目就是一个工程。
如果项目非常庞大,不适合使用package来划分模块,最好是一个模块就对应一个工程,利于分工写作,而借助于maven就可以将一个项目拆分为多个工程。
项目中的jar必须手动导入到指定位置。
带来的问题,同样的jar包会重复出现在不同项目工程中,一方面浪费资源,另外工程也比较臃肿。
借助maven,可以将jar包仅仅存放在仓库中,有需要的工程引用这个文件接口,并不需要真的把jar包复制过来。
所需jar包依赖的其他jar包也需要手动加入到项目中。
如果所有jar包之间的依赖关系都需要程序员自己非常清楚的了解,会极大增加学习成本。
而maven会自动将被依赖的jar包导入进来。
maven是什么
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理 。
构建过程中的几个主要环节
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:将每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对象war包。
⑥安装:在Maven环境下特指将打包的结果——Jar包或War包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
maven怎么用
安装maven
1.官网下载安装(www.apache.org),
2.选择bin.zip的版本
3.解压到安装目录 path中加入maven安装目录下的bin目录路径 (注,使用maven需要对应jdk版本支持,比如Maven 3.3以上的版本需要 JDK 1.7 或者以上的版本来支持其执行)
4.增加maven环境变量,在系统环境变量中添加M2_HOME,地址为maven的根目录,在path里添加%M2_HOME%\bin.
5.测试安装成功:cmd中执行mvn -v,可以查看到当前安装的maven 版本。
6.修改配置文件,apache-maven-xxx\conf目录下的settings文件,修改localRepository 为 < localRepository> 对应本地仓库目录 < /localRepository>,可以在mirrors标签中新增国内镜像源,下载资源速度更快
Maven的核心概念
1.约定的目录结构
①根目录:为工程名
②src目录:源码
③main目录:存放主程序
④也可以使用resources文件夹存放其他需要的资源文件
⑤test 存放测试程序
⑥pom.xml文件:project object module项目对象模型,maven工程的核心配置文件
为什么这么设计:
①、Maven 要负责项目的自动化构建,如果以编译为例,Maven 要想自动进行编译,那么它必须知道 Java 的源文件保存在哪里,这样约定之后,不用我们手动指定位置,Maven 能知道位置,从而帮我们完成自动编译。
②、遵循 约定>>>配置>>>代码。即能进行配置的不要去代码指定,能事先约定规则的不要去进行配置。这样既减轻了劳动力,也能防止出错。
2.POM
maven中的setting.xml主要用于配置maven的运行环境邓一些列通用的系统属性,相当于全局的配置文件,而pom.xml则主要用于描述当前项目的maven坐标,依赖关系,开发组织,开发版本,等等其他相关的因素,pom是将项目抽象成为一个对象模型,从而通过对其配置来指定项目的各个属性,是项目级别的配置文件。
3.坐标
一般有gav三个标签组成,分别指的是
①< groupId>一般为开发组织的域名反写</ groupId>, 指的是公司或者组织的唯一标志
② < artifactId>trade-core</ artifactId> 本项目的唯一ID,一个groupId下面可能多个项目,可通过artifactId来区分。
③< version>1.0.0-SNAPSHOT</ version>
本项目目前所处的版本号(注,快照版本的项目在每次执行的时候都会重新下载)
④< packaging>jar< /packaging>
打包的机制,如jar, war等等,默认为jar
4.依赖
maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。
依赖作用域一般按照如下分类:
①compile:编译范围(默认为编译范围)
②provided:已提供范围(用来编译应用程序,但是无需部署,在程序实际的运行环境具备该条件)
③runtime:运行时范围(编译时不需要,但在程序运行时候需要,比如JDBC驱动等)
④test:测试范围(在执行测试时需要的依赖)
⑤system:系统范围
pom.xml配置示例:如下为一个测试时依赖的配置
< dependencies>
< dependency>
< groupId>junit< /groupId>
< artifactId>junit</ artifactId>
< version>3.8.1</ version>
< scope>test</ scope>
</ dependency>
</ dependencies>
依赖的传递,
①若一个项目A依赖C同时,A依赖B依赖C,则按照就近原则会配置A所依赖的C的版本。
②若一个项目A依赖B依赖C,同时A依赖E依赖C,那么优先匹配先声明的依赖的C的版本。
屏蔽依赖关系
屏蔽依赖关系。 比如项目中使用的libA依赖某个库的1.0版,libB依赖某个库的2.0版,现在想统一使用2.0版,就应该屏蔽掉对1.0版的依赖
< dependency>
< groupId>org.hibernate</ groupId>
< artifactId>hibernate-validator</ artifactId>
< version>4.3.1.Final</ version>
< exclusions>
< exclusion>
< artifactId>slf4j-api</ artifactId>
< groupId>org.slf4j</ groupId>
</ exclusion>
</ exclusions>
</ dependency>
5.仓库
仓库的分类
①本地仓库:在本机上部署maven仓库,为本机上的所有maven项目提供服务。在settings.xml中添加
< localRepository>本地仓库目录</ localRepository>
②远程仓库
私服:搭建在局域网环境中,为局域网范围内的所有Maven工程服务
以阿里云为例,在
< mirror>
< id>alimaven</ id>
< name>aliyun maven</ name>
< url>http://maven.aliyun.com/nexus/content/groups/public/</ url>
< mirrorOf>central</ mirrorOf>
</ mirror>
</ mirrors>
添加配置
③中央仓库:maven的中央仓库,若需要文件在本地和远程仓库都不存在时,会在maven中央仓库下载,地址为:https://mvnrepository.com/ 速度较慢
仓库的优先级
local -> private-> central
6.生命周期
- maven项目按照各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行。
- Maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。
- Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期中各个阶段:不论现在要执行生命周期中的哪一阶段,都是从这个生命周期最初的位置开始执行。
- Maven有三套相互独立的生命周期,分别是:
①Clean Lifecycle:在进行真正的构建之前进行一些清理工作。
②Default Lifecycle:构建的核心部分,编译、测试、打包、安装、部署等等。
③Site Lifecycle:生成项目报告,站点,发布站点。
他们相互独立。也可以直接运行 mvn clean install site 运行所有这三套生命周期。 - 每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行 mvn clean,这个 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段。
- Clean生命周期
①pre-clean:执行一些需要在clean之前完成的工作
②clean:移除所有上一次构建生成的文件
③post-clean:执行一些需要在clean 之后立刻完成的工作 - Default生命周期
Default生命周期是Maven主要的生命周期,用于构建应用程序
validate:验证项目 验证项目是否正确且所有必须信息是可用的t
initialize:建立初始化状态,
compile:执行编译 源代码编译在此阶段完成
test:测试 使用适当的单元测试框架(例如JUnit)运行测试。
package:打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
verify:检查 对集成测试的结果进行检查,以保证质量达标
install:安装,安装打包的项目到本地仓库,以供其他项目使用
deploy:部署,拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 - Site生命周期
①pre-site 执行一些需要在生成站点文档之前完成的工作
②site 生成项目的站点文档
③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
④site-deploy 将生成的站点文档部署到特定的服务器上
常用maven命令
maven 命令的格式为 mvn [plugin-name]:[goal-name],可以接受的参数如下。
-D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试;
-P 指定 Profile 配置,可以用于区分环境;
-e 显示maven运行出错的信息;
常用项目命令
创建maven项目:mvn archetype:create
指定 group: -DgroupId=packageName
指定 artifact:-DartifactId=projectName
创建web项目:-DarchetypeArtifactId=maven-archetype-webapp
创建maven项目:mvn archetype:generate
验证项目是否正确:mvn validate
maven 打包:mvn package
只打jar包:mvn jar:jar
生成源码jar包:mvn source:jar
产生应用需要的任何额外的源代码:mvn generate-sources
编译源代码: mvn compile
编译测试代码:mvn test-compile
运行测试:mvn test
运行检查:mvn verify
清理maven项目:mvn clean
生成eclipse项目:mvn eclipse:eclipse
清理eclipse配置:mvn eclipse:clean
生成idea项目:mvn idea:idea
安装项目到本地仓库:mvn install
发布项目到远程仓库:mvn:deploy
在集成测试可以运行的环境中处理和发布包:mvn integration-test
显示maven依赖树:mvn dependency:tree
显示maven依赖列表:mvn dependency:list
下载依赖包的源码:mvn dependency:sources
安装本地jar到本地仓库:mvn install:install-file -DgroupId=packageName -DartifactId=projectName -Dversion=version -Dpackaging=jar -Dfile=path
web项目相关命令
启动tomcat:mvn tomcat:run
启动jetty:mvn jetty:run
运行打包部署:mvn tomcat:deploy
撤销部署:mvn tomcat:undeploy
启动web应用:mvn tomcat:start
停止web应用:mvn tomcat:stop
重新部署:mvn tomcat:redeploy
部署展开的war文件:mvn war:exploded tomcat:exploded