之前也用过maven,但一直都是知其然不知所以然,正好有时间,就从头完整的理一遍,加深印象。本篇将学习maven如何去构建项目。
Maven是什么?优点是啥?
Maven是java项目管理工具,支持依赖管理和项目的构建。
- 依赖管理:只需要在pom.xml中,写入需要引用的jar包,自动下载管理,开发者不用自己去下载jar并下载它依赖的jar,也不会有jar包的冲突问题,新人上手直接一个pom文件,不用拷贝大量的jar文件。
- 项目的构建:内置许多的插件,支持多种任务,包括清理、编译、测试、打包、部署、发布。
Maven的仓库
仓库是在某个统一的位置存储所有项目的共享的构件。
本地仓库:顾名思义就是在本地计算机上的仓库,所有本地项目共享构件,如果本地不存在,就会从中央仓库下载到本地来。
中央仓库:是Maven在http://repo.maven.apache.org/maven2这个地址存放的构件。
私服:架在局域网内的仓库服务,私服代理广域网的远程仓库,供局域网内的Maven用户使用。
修改本地仓库默认存放位置
修改maven的setting.xml文件,maven本地仓库默认存放在用户的/.m2/respositoy目录下,我们在settint.xml文件使用localReposity来更改默认保存位置。更改为c:/fp/repository目录,这样就把jar包下载到我们配置的目录下。如下图所示:
maven目录结构
MavenProjectRoot(项目根目录)
|----src
| |----main
| | |----java ——存放项目的.java文件
| | |----resources ——存放项目资源文件,如spring, hibernate配置文件
| |----test
| | |----java ——存放所有测试.java文件,如JUnit测试类
| | |----resources ——存放项目资源文件,如spring, hibernate配置文件
|----target ——项目输出位置
|----pom.xml ----用于标识该项目是一个Maven项目
本地创建项目目录
我们现在c:/fp目录下创建文件夹mavenDemo作为新项目的根目录,然后按照下图添加文件夹和pom文件。
在pom文件中添加如下内容:
<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.maven</groupId>
<!--项目名-->
<artifactId>Hello</artifactId>
<!--项目版本-->
<version>0.0.1-SNAPSHOT</version>
<!--添加依赖的jar包-->
<dependencies>
<!--项目要使用到junit的jar包,所以在这里添加junit的jar包的依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Maven命令
首先理解maven的生命周期,因为maven执行一个生命周期的命令时,会执行之前所有的生命周期操作,每一个生命周期都是对应的插件在执行。
mvn clean:清理项目缓存的输出。
mvn compile: 编译,将Java 源程序编译成 class 字节码文件。
mvn package:打包(jar等)到本项目的target下
mvn install:把target下打的包(jar等)安装到本地仓库,可以供其他项目使用
mvn deploy:将打包的文件发布到远程参考,提供其他人员进行下载依赖
mvn clean package:会比mvn package多一个clean的生命周期。
mvn test:执行测试,并生成class文件到target/test-classes目录
实践检验真理
上面创建的项目的初始目录结构如下:
mvn compile命令编译项目
可以看出,mvn compile会执行两个生命周期 resources和compile,每一个生命周期都是对应的插件在执行,同时在当前目录生成target目录,里面包含编译好的class文件。
mvn clean:清理项目缓存的输出。
即删除了刚才生成的target目录,如下图
mvn package:打包(jar等)到本项目的target下
mvn package共执行了6个生命周期不包括clean生命周期,并打包jar到本项目的target目录下,如下图所示
mvn clean package:会比mvn package多一个clean的生命周期。
mvn install:把target下打的包(jar等)安装到本地仓库,可以供其他项目使用
从上图中可以看出,mvn install会执行之前的6个生命周期,每个生命周期都有对应的插件在执行。并且mvn install 会把打包的jar文件安装到本地仓库,如下图,
mvn test:执行测试,并生成class文件到target/test-classes目录
eclipse中的maven命令
最后说一下eclipse中的maven命令,eclipse提供了和maven一样的基本命令
maven test
maven install
maven clean
也可以使用maven build...自定义组合maven 命令,并保存。
Maven update project
当pom.xml文件改动之后,或者有依赖的jar包在本地maven仓库( local repository )中有更新和内容改变,需要Eclipse执行Maven/Update Project来更新引入在本地maven库中的外部依赖的jar包。