Apache Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。
使用maven构建的javaweb项目的结构
- src
- main
- java
- package
- java
- test
- java
- package
- java
- resource
- main
maven常用的一些命令
- mvn -v : 查看mvn的版本
- mvn compile : 编译源代码
- mvn test : 运行项目的测试用例
- mvn package : 打包项目
- mvn deploy : 发布项目
- mvn clean : 删除target
- mvn install : 安装jar包到本地仓库中
- mvn archetype : generate : 自动建立目录骨架
Maven常见的依赖范围
- compile : 编译依赖,默认的依赖方式。
- test : 测试依赖,只在编译测试用例和运行测试用例有效,典型地有JUnit。
- provided : 对于编译和测试有效,不会打包进发布包中,典型的例子为servlet-api,一般的web工程运行时都使用容器的servlet-api。
- runtime : 只在运行测试用例和实际运行时有效,典型地是jdbc驱动jar包。
- system : 不从maven仓库获取该jar,而是通过systemPath指定该jar的路径。
- import : 用于一个dependencyManagement对另一个dependencyManagement的继承。
Maven的本地资源
通常情况下,maven的资源包都在.m2这个目录下,但是有的时候我们不想放在这个默认的目录下,所以就需要去修改{M2_HOME}\conf\setting.xml
里的localRepository
。比如:
<localRepository>/Users/cm_wang/Documents/WorkSpace/repo</localRepository>
就证明我们的资源包都在/Users/cm_wang/Documents/WorkSpace/repo
这里面存储。
Maven国内镜像仓库
修改settings.xml里的mirrors
标签
<mirrors>
<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有以下三种标准的生命周期:
- clean:清理项目
- pre-clean:执行清理前的工作
- clean:清理上一次构建生成的所有文件
- post-clean:执行清理后的文件
- default:构建项目
- 是生命周期中的最核心的,阶段比较多。比如:install,compile,test等
- site:生成项目站点
- pre-site:在生成项目站点前需要完成的工作
- site:生成项目的站点文档
- post-site:在生成项目站点后要完成的工作
- site-deploy:发布生成的站点到服务器上
- clean:清理项目
Maven中的POM
- POM代表项目对象模型。它是Maven中工作的基本单位,这是一个XML文件。它始终保存在该项目基本目录中的pom.xml文件。POM包含的项目是使用Maven来构建的,它用来包含各种配置信息。POM也包含了目标和插件。在执行任务或目标时,Maven会使用当前目录中的POM。它读取POM得到所需要的配置信息,然后执行目标。
- 值得注意的是,每一个项目有且唯一只有一个POM文件(pom.xml)
- 所有的 POM 文件要项目元素必须有三个必填字段:
groupId
,artifactId
,version
- 在库中的项目符号是:
groupId:artifactId:version
- pom.xml 的根元素是 project,它有三个主要的子节点。
- 所有的 POM 文件要项目元素必须有三个必填字段:
节点 | 描述 |
---|---|
groupId | 这是项目组的编号,这在组织或项目中通常是独一无二的。例如:com.test.xxx |
artifactId | 这是项目的ID。这通常是项目的名称。 |
version | 这是项目的版本。与groupId一起使用,artifact在存储库中用于将版本彼此分离。 |
<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 模型版本。maven2.0必须是这样写,现在是maven2唯一支持的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.winner.trade,maven会将该项目打成的jar包放本地路径:/com/winner/trade -->
<groupId>com.winner.trade</groupId>
<!-- 本项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>trade-core</artifactId>
<!-- 本项目目前所处的版本号 -->
<version>1.0.0-SNAPSHOT</version>
<!-- 打包的机制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar -->
<packaging>jar</packaging>
<!-- 定义本项目的依赖关系 -->
<dependencies>
<!-- 每个dependency都对应这一个jar包 -->
<dependency>
<!--一般情况下,maven是通过groupId、artifactId、version这三个元素值(俗称坐标)来检索该构件, 然后引入你的工程。如果别人想引用你现在开发的这个项目(前提是已开发完毕并发布到了远程仓库),-->
<!--就需要在他的pom文件中新建一个dependency节点,将本项目的groupId、artifactId、version写入, maven就会把你上传的jar包下载到他的本地 -->
<groupId>com.winner.trade</groupId>
<artifactId>trade-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!-- maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。 -->
<!--scope包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围) -->
<scope>test</scope>
<!-- 设置指依赖是否可选,默认为false,即子项目默认都继承:为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似 -->
<optional>false</optional>
<!-- 屏蔽依赖关系。 比如项目中使用的libA依赖某个库的1.0版,libB依赖某个库的2.0版,现在想统一使用2.0版,就应该屏蔽掉对1.0版的依赖 -->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 为pom定义一些常量,在pom中的其它地方可以直接引用 使用方式 如下 :${file.encoding} -->
<properties>
<file.encoding>UTF-8</file.encoding>
<java.source.version>1.5</java.source.version>
<java.target.version>1.5</java.target.version>
</properties>
<!--使用的插件列表 。 -->
<plugins>
<plugin>
<groupId></groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->
<executions>
<execution>
<!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->
<id>assembly</id>
<!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->
<phase>package</phase>
<!--配置的执行目标 -->
<goals>
<goal>single</goal>
</goals>
<!--配置是否被传播到子POM -->
<inherited>false</inherited>
</execution>
</executions>
<!--作为DOM对象的配置,配置项因插件而异 -->
<configuration>
<finalName>${finalName}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptor>assembly.xml</descriptor>
</configuration>
<!--是否从该插件下载Maven扩展(例如打包和类型处理器), -->
<!--由于性能原因,只有在真需要下载时,该元素才被设置成true。 -->
<extensions>false</extensions>
<!--项目引入插件所需要的额外依赖 -->
<dependencies>
<dependency>...</dependency>
</dependencies>
<!--任何配置是否被传播到子项目 -->
<inherited>true</inherited>
</plugin>
</plugins>
</project>
Maven中的setting.xml
首先要明确的是setting.xml所在的目录一般有两种:
- 安装的地方:${M2_HOME}/conf/settings.xml(全局配置)
- 用户的目录:${user.home}/.m2/settings.xml(用户配置)
- 如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml会覆盖全局的settings.xml。
实际应用中,经常使用的是<localRepository>
、<proxies>
、<servers>
、<mirrors>
这几个节点。
<?xml version="1.0" encoding="UTF-8"?>
<settings 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/settings-1.0.0.xsd">
<!--本地仓库。该值表示构建系统本地仓库的路径。其默认值为${user.home}/.m2/repository。 -->
<localRepository>usr/local/maven</localRepository>
<!--用来配置不同的代理,多代理profiles可以应对笔记本或移动设备的工作环境:通过简单的设置profile id就可以很容易的更换整个代理配置。 -->
<proxies>
<!--代理元素包含配置代理时需要的信息 -->
<proxy>
<!--代理的唯一定义符,用来区分不同的代理元素。 -->
<id>myproxy</id>
<!--该代理是否是激活的那个。true则激活代理。当我们声明了一组代理,而某个时候只需要激活一个代理的时候,该元素就可以派上用处。 -->
<active>true</active>
<!--代理的协议。 协议://主机名:端口,分隔成离散的元素以方便配置。 -->
<protocol>http://…</protocol>
<!--代理的主机名。协议://主机名:端口,分隔成离散的元素以方便配置。 -->
<host>proxy.somewhere.com</host>
<!--代理的端口。协议://主机名:端口,分隔成离散的元素以方便配置。 -->
<port>8080</port>
<!--代理的用户名,用户名和密码表示代理服务器认证的登录名和密码。 -->
<username>proxyuser</username>
<!--代理的密码,用户名和密码表示代理服务器认证的登录名和密码。 -->
<password>somepassword</password>
<!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。 -->
<nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
</proxy>
</proxies>
<!--配置服务端的一些设置。一些设置如安全证书不应该和pom.xml一起分发。这种类型的信息应该存在于构建服务器上的settings.xml文件中。 -->
<servers>
<!--服务器元素包含配置服务器时需要的信息 -->
<server>
<!--这是server的id(注意不是用户登陆的id),该id与distributionManagement中repository元素的id相匹配。 -->
<id>server001</id>
<!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 -->
<username>my_login</username>
<!--鉴权密码 。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 -->
<password>my_password</password>
<!--鉴权时使用的私钥位置。和前两个元素类似,私钥位置和私钥密码指定了一个私钥的路径(默认是/home/hudson/.ssh/id_dsa)以及如果需要的话,一个密钥 -->
<!--将来passphrase和password元素可能会被提取到外部,但目前它们必须在settings.xml文件以纯文本的形式声明。 -->
<privateKey>${usr.home}/.ssh/id_dsa</privateKey>
<!--鉴权时使用的私钥密码。 -->
<passphrase>some_passphrase</passphrase>
<!--文件被创建时的权限。如果在部署的时候会创建一个仓库文件或者目录,这时候就可以使用权限(permission)。-->
<!--这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 -->
<filePermissions>664</filePermissions>
<!--目录被创建时的权限。 -->
<directoryPermissions>775</directoryPermissions>
<!--传输层额外的配置项 -->
<configuration></configuration>
</server>
</servers>
<!--为仓库列表配置的下载镜像列表。 -->
<mirrors>
<!--给定仓库的下载镜像。 -->
<mirror>
<!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>planetmirror.com</id>
<!--镜像名称 -->
<name>PlanetMirror Australia</name>
<!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://downloads.planetmirror.com/pub/maven2</url>
<!--被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo1.maven.org/maven2)的镜像,-->
<!--就需要将该元素设置成central。这必须和中央仓库的id central完全一致。 -->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>