简介:
构建:编译,运行单元测试,生成文档,打包,部署
优点:作为构建工具,可以帮助我们自动化构建,抽象构建过程,提供构建任务实现;跨平台,对外提供一致的操作接口。
Maven 不仅仅是构建工具,还是一个依赖管理工具和项目信息管理工具。提供了中央库,帮助我们自动下载构件。
Maven安装
- 需要先安装JDK环境
- 下载解压缩Maven压缩包
- 配置Maven环境变量 (windows下cmd命令会先在当前目录寻找可执行脚本,没有就会去path定义的路径下找)
- 检查环境变量 echo %MAVEN_HOME% ,查看maven版本 mvn -version
Eclipse重要组件:插件地址 http://m2eclipse.sonatype.org/sites/m2e-extras
- Maven SCM handler for Subclipse(Optional):帮助从SVN服务器签出Maven项目,需要先集成SVN
- Maven SCM Integration(Optional):Maven与SCM集成,利用各种SCM工具(如SVN)实现Maven项目的签出和具体化等操作
- Project configurators for commonly used maven plugins(temporary):临时组件,支持一些Maven插件与Eclipse的集成
常用指令
mvn clean 清空target目录mvn compile 编译项目,生成class文件mvn package 打包生成jar文件等mvn install 将生成的jar文件安装到本地仓库,这样其他项目就可以依赖使用了mvn deploy 将jar包发布到私服仓库,供其他人下载使用
install -DskipTests=true 跳过测试
Maven可配置多套环境(develop,test,stage)开发环境,测试环境,生产环境mvn -Ptest 以test的配置打包mvn version:set -DnewVersion=2.0.0 -DgenerateBackupPoms=false 统一修改pom文件中的版本信息
目录
- bin:包含mvn运行的脚本
- boot:只包含一个plexus-classworlds-***.jar,是一个类加载器框架,比java默认的类加载器提供了更丰富的语法以方便配置。Maven使用该框架加载自己的类库
- conf:settings.xml全局定制Maven的行为,建议将该文件复制到~/.m2/目录下,在用户范围定义maven行为
- lib:包含maven运行时需要的java类库
Maven基本概念
坐标体系
- groupId:定义当前Maven项目隶属的实际项目(一个实际项目下可能对应多个maven项目,如:spring项目下有spring-core,spring-web等),groupId不应该对应项目隶属的组织或公司,因为组织下会有多个项目,artifactId只能定义Maven项目模块,可能会导致实际项目这一层很难定义。如:com.sinoair.hlink.wms
- artifactId:定义实际项目中的一个Maven项目模块,通常使用实际项目名作为前缀,如:wms-facade,wms-frontweb
- version:定义maven项目当前所处的版本
- classifier:定义构建输出的附属构件,如Java文档和源码。不能直接定义
依赖配置
- groupId,artifactId,version:依赖的基本坐标
- type:依赖的类型,对应坐标定义的packaging。默认为jar
- scope:依赖范围,控制编译环境变量classpath,测试classpath,运行classpath的关系
- compile:编译依赖范围。默认值,对编译,测试,运行都有效
- test:测试依赖范围。只对测试有效,在编译主代码和运行项目时无法使用,如 junit.jar 包
- provided:已提供范围。对编译和测试有效,运行时无效,如 servlet-api.jar
- runtime:运行时范围。测试和运行有效,编译时无效,如jdbc驱动包
- system:系统范围。与provided一致,依赖与本地绑定(依赖本地磁盘路径下的包)
如:<dependency><groupId>com.sinoair.hlink</groupId><artifactId>wms-facade</artifactId><version>1.0.0-SNAPSHOT</version><scope>system</scope><systemPath>${java.home}/lib/rt.jar</systemPath><dependency>
- optional:依赖是否可选
- exclusions:排除传递性依赖
传递性依赖
A依赖B,B依赖C,则A就自然依赖C
排除依赖
如上A>B>C的例子,假如C是snapshot版本,这时我们就可以排除B对C的依赖,然后自己再配置一个对C稳定版本的依赖
如:
<dependency> <groupId>com.sinoair.hlink</groupId> <artifactId>B</artifactId> <version>1.0.0</version> <!—剔除不稳定版本的依赖--> <exclusions> <exclusion> <groupId> com.sinoair.hlink </groupId> <artifactId>C</artifactId> <version>1.0.0-SNAPSHOT </version> </exclusion> </exclusions> </dependency> <!—自定义对稳定版本的依赖--> <dependency> <groupId>com.sinoair.hlink</groupId> <artifactId>C</artifactId> <version>1.0.0</version> </dependency>
归类依赖
<!—统一定义版本信息然后引用--> <properties> <junit.version>4.12</junit.version> <properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependencies>
依赖查看
Maven会自动解析所有项目的直接依赖和传递性依赖,并且根据规则正确判断每个依赖的范围,对于一些依赖冲突,也能进行调节。最后得到的依赖叫做 已解析依赖。mvn dependency:list 查看当前项目的已解析依赖pom中配置的依赖为顶层依赖,顶层依赖的依赖叫做第二层依赖,一次类推第三,第四层依赖,这就形成一个依赖树mvn dependency:tree 查看依赖树mvn dependency:analyze 分析依赖,找出一些用到但没显示声明的依赖和显示声明但没用到的依赖