Maven
Maven 是一个项目管理和整合工具,能够管理项目的构建、报告和文档,为开发者提供了一套完整的构建生命周期框架。Maven 简化了工程的构建过程,并对其标准化。
一、安装配置
1. mvn命令:下载http://maven.apache.org/download.cgi; 添加环境变量M2_HOME 或MAVEN_HOME,并加到PATH变量中; 使用mvn –version检查
2. eclipse集成: Window→Preferences→Maven→Installations→Add 选择下载的maven目录; User settings修改为目录中的settings.xml配置文件
3. 启用代理访问: 去掉conf/settings.xml文件中proxy的注释,修改为实际的代理服务器。
二、Maven仓库
当构建一个Maven项目时,首先检查pom.xml文件以确定依赖包的下载位置,然后按照以下顺序查找:本地资源库→中央仓库→远程仓库,如果都没有找到,那么Maven就会抛出异常。
1. 本地资源库(用来存储所有项目的依赖关系, 插件jar和其他文件): 修改settings.xml中的变量值localRepository为指定的本地目录
2. 中央仓库: Maven社区提供的仓库,其中包含了大量常用的库,是Maven默认配置的仓库。http://search.maven.org
3. 远程仓库:在pom.xml文件中设置repository
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!-- 添加JBoss远程仓库 --> <project ...> <repositories> <repository> <id>JBoss repository</id> <url>http://repository.jboss.org/nexus/content/groups/public/</url> </repository> </repositories> </project>
Maven依赖机制
在 Maven 依赖机制的帮助下自动下载所有必需的依赖库,并保持版本升级。传统使用 Log4j需要手动下载jar包,并将其加入到项目依赖中。而使用Maven之需要配置log4j 的Maven 坐标, 当 Maven 编译或构建,log4j的 jar会自动下载,并把它放到 Maven本地存储库。如果“version”标签被忽略,它会自动升级库时当有新的版本时。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> </dependencies>
当使用的 jar 不存在于 Maven的中心储存库中,可以手动复制下载的jar到本地仓库,或使用以下命令安装到本地仓库:
mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
三、POM
代表项目对象模型,包含各种配置信息
POM 文件有三个必填字段: groupId
,artifactId
,version,这三个元素组成了该
项目在库中的标识符。
groupId:表明其所属组织或公司及其所属项目,命名规则为组织或公司域名反转加项目名称。
artifactId:项目的模块名,通常与实际项目名称一致。模块的命名通常为项目名前缀加模块名。
version:当前项目的版本号。
packaging:定义项目的打包方式,可选值有jar、war、pom。默认为jar
dependencies元素包含了所有依赖的jar包,每一个jar包依赖使用dependency元素定义。 在声明一个jar包依赖时,除了指定groupId、artifactId、version这三项基本坐标外,还可以使用使用以下元素进行配置:
scope元素:指定依赖的范围
compile:(默认值)依赖在编译、测试、运行期间都有效。是一个比较强的依赖。打包的时候通常需要包含进去
test:依赖包仅仅参与测试相关的工作,包括测试代码的编译和执行,但不会被打包,例如:junit
provided:相当于compile,但是打包阶段做了exclude操作,运行期间不会使用这个依赖。例如servlet-api,在运行时容器已经提供,不需要再重复引入。
runtime:表示被依赖项目无需参与项目的编译,只用于运行和测试。例如JDBC驱动,适用运行和测试阶段
system:和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径
exclusions元素:排除传递性依赖
所有的 POM 都继承自一个父 POM(Super POM),它包含了一些可以被继承的默认设置。它帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被方便的重写。可以使用命令查看Super POM的默认配置:mvn help:effective-pom,该文件设置了默认的工程源码目录结构、输出目录、需要的插件、仓库和报表目录。Super POM配置信息如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?>
<!-- ================================================================= -->
<!-- -->
<!-- Generated by Maven Help Plugin on 2012-07-05T11:41:51 -->
<!-- See: http://maven.apache.org/plugins/maven-help-plugin/ -->
<!-- -->
<!-- ================================================================= -->
<!-- ================================================================= -->
<!-- -->
<!-- Effective POM for project -->
<!-- 'com.companyname.project-group:project-name:jar: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 h
ttp://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<sourceDirectory>C:\MVN\project\src\main\java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>C:\MVN\project\src\test\java</testSourceDirectory>
<outputDirectory>C:\MVN\project\target\classes</outputDirectory>
<testOutputDirectory>C:\MVN\project\target\test-classes</testOutputDirectory>
<resources>
<resource>
<mergeId>resource-0</mergeId>
<directory>C:\MVN\project\src\main\resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<mergeId>resource-1</mergeId>
<directory>C:\MVN\project\src\test\resources</directory>
</testResource>
</testResources>
<directory>C:\MVN\project\target</directory>
<finalName>project-1.0</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</version>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.4</version>
</plugin>
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<version>2.3.1</version>
</plugin>
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
<version>2.1</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.5</version>
</plugin>
<plugin>
<artifactId>maven-plugin-plugin</artifactId>
<version>2.4.3</version>
</plugin>
<plugin>
<artifactId>maven-rar-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.0-beta-8</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>2.0-beta-7</version>
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.0.4</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1-alpha-2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-help-plugin</artifactId>
<version>2.1.1</version>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
</pluginRepository>
</pluginRepositories>
<reporting>
<outputDirectory>C:\MVN\project\target/site</outputDirectory>
</reporting>
</project>
Maven 构建生命周期
一个典型的 Maven 构建生命周期是由以下几个阶段的序列组成的,每个阶段定义了目标被执行的顺序。当需要在某个特定阶段之前或之后执行目标时,可以使用 pre 和 post 来定义这个目标。
阶段 | 处理 | 描述 |
---|---|---|
prepare-resources | 资源拷贝 | 本阶段可以自定义需要拷贝的资源 |
compile | 编译 | 本阶段完成源代码编译 |
package | 打包 | 本阶段根据 pom.xml 中描述的打包配置创建 JAR / WAR 包 |
install | 安装 | 本阶段在本地 / 远程仓库中安装工程包 |
当 Maven 开始构建工程,会按照所定义的阶段序列的顺序执行每个阶段注册的目标。Maven 有以下三个标准的生命周期:
- clean
- default(or build)
- site
参考文章:易百教程