Maven知识点总结
一.Maven的用途
主要服务于基于JAVA平台的项目构建,依赖管理和项目信息管理。即——Maven是一个构建工具
二.Maven的具体介绍
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目(有各自Ant build文件),仅有细微的差别,而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享JARs。
Maven是一个项目管理工具,它包含了一个项目对象模型 ,一组标准集合,一个项目生命周期,一个依赖管理系统,和用来运行定义在生命周期阶段中插件目标的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。
三.Maven的命令目录:
mvn archetype:create 创建Maven项目
mvn compile 编译源代码
mvn test-compile 编译测试源代码
mvn test 运行应用程序中的单元测试
mvn site 生成项目相关信息的网站
mvn clean 清除项目目录中的生成结果
mvn package 根据项目生成的jar
mvn install 在本地Respository中安装jar
mvn eclipse:eclipse 生成eclipse项目文件
mvn jetty:run 启动jetty服务
mvn tomcat:run 启动tomcat服务
四.使用Maven构建的优点:
- 一个项目就是一个工程
如果项目非常庞大,就不适合使用package来划分模块,最好是每一个模块对应一个工程,利于分工协作。借助于maven就可以将一个项目拆分成多个工程。
- 项目中使用jar包,需要“复制”、“粘贴”项目的lib中
同样的jar包重复的出现在不同的项目工程中,你需要做不停的复制粘贴的重复工作。借助于maven,可以将jar包保存在“仓库”中,不管在哪个项目只要使用引用即可就行。
- jar包需要的时候每次都要自己准备好或到官网下载
借助于maven我们可以使用统一的规范方式下载jar包,规范。
4.jar包版本不一致的风险
不同的项目在使用jar包的时候,有可能会导致各个项目的jar包版本不一致,导致未执行错误。借助于maven,所有的jar包都放在“仓库”中,所有的项目都使用仓库的一份jar包。
- 一个jar包依赖其他的jar包需要自己手动的加入到项目中
FileUpload组件->IO组件,commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar极大的浪费了我们导入包的时间成本,也极大的增加了学习成本。借助于maven,它会自动的将依赖的jar包导入进来。
五.使用Maven构建的各个环节
1.清理clean:将以前编译得到的旧文件class字节码文件删除
2.编译compile:将java源程序编译成class字节码文件
3.测试test:自动测试,自动调用junit程序
4.报告report:测试程序执行的结果
5.打包package:动态Web工程打War包,java工程打jar包
6.安装install:Maven特定的概念-----将打包得到的文件复制到“仓库”中的指定位置
7.部署deploy:将动态Web工程生成的war包复制到Servlet容器下,使其可以运行
六.Maven使用实践
1.创建约定的目录结构
[1] 根目录:工程名
[2] |---src:源码
[3] |---|---main:存放主程序
[4] |---|---|---java:java源码文件
[5] |---|---|---resource:存放框架的配置文件
[6] |---|---test:存放测试程序
[7] |---pop.xml:maven的核心配置文件
2.创建文件内容
例如,新建一个文件Test.java
package com.hzg.maven;
public class Hello {
public String sayHello(String name){
return "Test"+name;
}
}
POM文件内容:
<?xml version="1.0" ?><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.hzg.maven</groupId><artifactId>Test</artifactId><version>0.0.1-SNAPSHOT</version>
<name>Test</name>
<dependencies>
<dependency>
<groupId>junit</groupId><artifactId>junit</artifactId><version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.执行Maven命令
前面已提到过Maven的命令目录,但需要注意的是Maven的命令执行必须进入到pom.xml的目录中。
例如:运行mvn compile
这样,就将pom.xml中配置的包导入仓库中了
**仓库的默认位置:**c:Usrs[登录当前系统的用户名].m2 epository
此时我们发现,之前创建的项目里多了一个target文件夹,里面存放的就是编译后的字节码文件。运行mvn test-compile,target文件夹下面除了classes之外多了test-classes文件夹;运行mvn package,target文件夹下面又多了一个打好的jar包;运行mvn clean,发现整个target文件夹都没了。又回到了编译之前我们手动创建的文件夹。
七.仓库和坐标
pom.xml:Project Object Model 项目对象模型。它是maven的核心配置文件,所有的构建的配置都在这里设置。
坐标:使用下面的三个向量在仓库中唯一的定位一个maven工程(groupId,artifactId,version)
maven工程的坐标与仓库中路径的关系:
<groupId>com.hzg.maven</groupId>
<artifactId>Test</artifactId>
<version>0.0.1-SNAPSHOT</version>//本项目的坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.4.RELEASE</version>
<scope>compile</scope>
<dependency>//依赖的项目坐标
仓库的分类:
1、本地仓库:当前电脑上的仓库,路径上已经说过了哦
2、远程仓库:
(1)私服:搭建在局域网中,一般公司都会有私服,私服一般使用nexus来搭建。具体搭建过程可以查询其他资料
(2)中央仓库:架设在Internet上,像刚才的springframework就是在中央仓库上
以上提到的scope之前没有解释过,这实际上就是指依赖的范围
1、compile,默认值,适用于所有阶段(开发、测试、部署、运行),本jar会一直存在所有阶段。
2、provided,只在开发、测试阶段使用,目的是不让Servlet容器和你本地仓库的jar包冲突 。如servlet.jar。
3、runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
4、test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
5、system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
八.生命周期
Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,初学者容易将Maven的生命周期看成一个整体,其实不然。这三套生命周期分别是:
<1>Clean Lifecycle在进行真正的构建之前进行一些清理工作。Clean生命周期一共包含了三个阶段:
1、pre-clean 执行一些需要在clean之前完成的工作
2、clean 移除所有上一次构建生成的文件
3、post-clean 执行一些需要在clean之后立刻完成的工作
<2>Default Lifecycle构建的核心部分,编译,测试,打包,部署等等
validate
generate-sources
process-source
generate-resources
process-resources//复制并处理资源文件,至目标目录,准备打包
compile//编译项目的源代码
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources//复制并处理资源文件,至目标测试目录
test-compile//编译测试源代码
process-test-classes14、test//使用合适的单元测试框架运行测试,这些测试代码不会被打包或部署
prepare-package16、package//接受编译好的代码,打包成可发布的格式,如 JAR
pre-integration-test
integration-test
post-integration-test
verify
install//将包安装至本地仓库,以让其它项目依赖。
deploy//将最终的包复制到远程的仓库,以让其它开发人员与项目共享
执行mvn install,其中已经执行了compile 和 test 。
总结:不论你要执行生命周期的哪一个阶段,maven都是从这个生命周期的开始执行
插件:每个阶段都有插件,看上面标红的。插件的职责就是执行它对应的命令。
<3>Site Lifecycle生成项目报告,站点,发布站点
pre-site //执行一些需要在生成站点文档之前完成的工作
site //生成项目的站点文档
post-site //执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy // 将生成的站点文档部署到特定的服务器上
九.Maven中的build配置
<build>
<!-- 项目的名字 -->
<finalName>WebMavenDemo</finalName>
<!-- 描述项目中资源的位置 -->
<resources>
<!-- 自定义资源1 -->
<resource>
<!-- 资源目录 -->
<directory>src/main/java</directory>
<!-- 包括哪些文件参与打包 -->
<includes>
<include>**/*.xml</include>
</includes>
<!-- 排除哪些文件不参与打包 -->
<excludes>
<exclude>**/*.txt</exclude>
<exclude>**/*.doc</exclude>
</excludes>
</resource>
</resources>
<!-- 设置构建时候的插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- 源代码编译版本 -->
<source>1.8</source>
<!-- 目标平台编译版本 -->
<target>1.8</target>
</configuration>
</plugin>
<!-- 资源插件(资源的插件) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>compile</phase>
</execution>
</executions>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- war插件(将项目打成war包) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- war包名字 -->
<warName>WebMavenDemo1</warName>
</configuration>
</plugin>
</plugins></build>
tifactId>maven-war-plugin
2.1
WebMavenDemo1
配置好build后,执行mvn package之后,在maven工程指定的target目录里war包和文件都按照配置的生成了