Maven简介

2017/07/01 - Java 工具

maven是一个项目管理和构建自动化工具,基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。

安装

http://jingyan.baidu.com/article/3d69c55157068af0ce02d76f.html

intellij 自带集成了maven工具,可配置IDE使用自己下载的maven版本(注意,maven2和3的区别还是很大的,某些老项目必须使用maven2构建)

生命周期

clean生命周期

真正构建之前进行一些清理工作

default生命周期

构建项目

  • validate:验证项目是否正确及构建项目所需的信息是否正确;
  • compile:编译项目源代码;
  • test-compile:编译测试源代码;
  • test:使用合适的单元测试框架运行测试;
  • package:接受编译好的代码,打包成可发布的格式;
  • install:将包安装至本地仓库,以让其它项目依赖;
  • deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

site生命周期

生成项目报告,站点,发布站点

配置文件及其参数简介

settings.xml

可配置本地仓库位置,远程仓库服务器以及认证信息等。

存在于两个地方。1又被叫做全局配置,2为用户配置。如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml优先。

  1. 安装目录/conf/settings.xml
  2. ~/.m2/settings.xml
    • localRepository:本地仓库的路径,默认值是${user.home} /.m2/ repository,如果想要把从远程仓库下载的jar包放在其他目录,只需要在这里修改成自己的目录即可;
    • interactiveMode:如果Maven要试图与用户交互来得到输入就设置为true,否则就设置为false,默认为true。
    • usePluginRegistry:如果需要让Maven使用文件${user.home}.m2/plugin-registry.xml来管理插件版本,则设为true。默认为false。
    • offline:如果构建系统要在离线模式下工作,设置为true,默认为false。如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,那么这个设置是非常有用的。
    • pluginGroups:这个元素包含了一系列pluginGroup元素,每个又包含了一个groupId。当一个plugin被使用,而它的groupId没有被提供的时候,这个列表将被搜索。
    • servers:如username和password;
    • mirrors:配置构建系统使用的镜像服务器;
    • proxies:配置代理服务器;
    • profiles:settings.xml中的profile是pom.xml中的profile的简洁形式。它包含了激活(activation),仓库(repositories),插件仓库(pluginRepositories)和属性(properties)元素。profile元素仅包含这四个元素是因为他们涉及到整个的构建系统,而不是个别的POM配置。如果settings中的profile被激活,那么它的值将重载POM或者profiles.xml中的任何相等ID的profiles。

pom.xml

pom.xml定义了项目的基本信息,用于描述项目如何构建,声明项目依赖

基本属性

  • modelVersion:指定了当前POM模型的版本,对于maven2及maven3来说,它只能是4.0.0;groupId,artifactId和version定义了一个项目的基本坐标
  • groupId:项目或者组织的唯一标志(项目组);
  • artifactId:项目名称;
  • version:项目版本

自定义属性

使用properties定义自己的属性,使用占位符“$”来进行引用。

Maven提供了三个隐式的变量,可以用来访问环境变量,POM信息,和Maven Settings

  • exv变量:可以用来引用操作系统环境变量,如${env.PATH}
  • project变量:可以用来引用的是当前这个xml中project根元素下面的子元素的值,比如: 1.0-SNAPSHOT,引用方式:${project.version};
  • settings变量:可以用来引用Maven本地配置文件xml文件中的属性,如:要引用settings下的本地仓库localRepository元素的值时,可以用${settings.localRepository};
  • java的系统属性:所有在java中使用java.lang.System.getProperties()能够获取到的属性都可以在pom.xml中引用,比如${java.home};

pom关系

1、依赖关系

<dependency>下,可以添加自己项目对其他包的依赖,maven会自动将我们所依赖的包添加到项目中。

type:相应依赖产品包形式,如:jar,war;

scope:用于限制相应的依赖范围,包括以下几种变量:

  • compile:默认范围,用于编译;
  • provided:类似compile,依赖的包只有当JDK或者一个容器已提供该依赖之后才能使用;
  • runtime:在运行和测试系统的时候需要,但在编译的时候不需要;
  • test:在运行和测试系统的时候需要,但在编译的时候不需要;
  • system: system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中jar文件的路径,如果要将一个依赖范围设置成系统范围,必须同时提供一个systemPath元素(该方式不推荐使用);

optional:标注可选,一般用在,假如你的项目为A,你在依赖类库B时,将optional设为true,则别人在依赖你的项目A时,B不会被传递依赖进去,如果别人也希望依赖这个类库,则也需要添加对类库B的依赖.

路径最短,申明顺序其次

如何隔离jar包

第一个很常用的exclusion来隔离jar包。

项目依赖project-a,但是project-a依赖project-b,但是该项目不想依赖project-b,所以利用exclusion来排除对project-b的依赖。

第二个不常用的方法就是创建一个空包。

空包的坐标和你需要隔离的Jar包坐标一样。项目中这个空包申明在pom文件靠前的地方,这样依据maven依赖原则,这个空包会优先被使用,后面所有无论是直接依赖还是间接依赖的相同坐标的jar包都不会被使用了。空包比exclusion的好处就是不用在所有间接依赖的地方去exclusion

2、继承关系

如果不想一遍又一遍的重复同样的依赖元素,可以通过继承parent元素,可避免这种重复。当一个项目指定一个父项目的时候,Maven在读取当前项目的POM之前,会使用这个父POM作为起始点。它继承所有东西,包括groupId和version。

3、聚合关系(modoules)

当Maven读取turorial1的POM的时候,它会检查它的modules元素,看到top-group引用了项目my-project1和my-project2。之后Maven会在它们的每个子目录中寻找pom.xml。Maven为每一个子模块重复这个过程.

dependencyManagement

能让所有在子项目中引用一个依赖而不用显式的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement 元素中指定的版本号。

在子pom里只需要添加对mysql-connector-java的依赖,而无需声明版本。这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改。另外如果某个子项目需要另外的一个版本,只需要声明自己的version就可。dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖.

build

主要用于设置构建项目所需要的信息(如plugins),可以包括:

  • defaultGoal: 定义默认的目标或者阶段。如install等
  • directory: 编译输出的目录;
  • finalName: 生成最后的文件的样式;
  • filter: 定义过滤,用于替换相应的属性文件,使用maven定义的属性。设置所有placehold的值;

resources

  • resources:这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里;
  • resource:这个元素描述了项目相关或测试相关的所有资源路径;
  • targetPath: 描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。举个例子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven /messages。然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。
  • filtering:是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。
  • directory:描述存放资源的目录,该路径相对POM路径
  • includes:包含的模式列表,例如*/.xml.
  • excludes:排除的模式列表,例如*/.xml

plugins插件

  • extensions:true or false,是否装载插件扩展。默认false;
  • inherited:true or false,是否此插件配置将会应用于那些继承于此的项目;
  • configuration:指定插件配置;
  • dependencies:插件需要依赖的包
  • executions:用于配置execution目标,一个插件可以有多个目标。

常用命令

命令 说明
mvn archetype:generate 创建 Maven项目
mvn compile 编译源代码
mvn test-compile 编译测试代码
mvn test 运行应用程序中的单元测试
mvn package 打包,依据项目生成 jar文件
mvn install 打包,并在本地 Repository中安装 jar
mvn deploy 打包,并上传到maven远程仓库
mvn clean 清除目标目录中的生成结果
mvn site 生成项目相关信息的网站
mvn dependency:tree -Dverbose 查看依赖
mvn dependency:resolve -Dclassifier=sources
mvn -U install 重新安装

其他


如果文章对您有帮助,欢迎扫描下方二维码赞助(一分也是爱噢),谢谢

Search

    一分也是爱噢 一分也是爱

    目录