1、Maven 教程Apache Maven 是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven 可以从一个中心资料片管理项目构建,报告和文件。本教程将介绍如何使用 Maven 在 Java 开发,或任何其他的编程语言的任何项目。Maven 是什么?Maven 是一个项目管理和综合工具。Maven 提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven 使用标准的目录结构和默认构建生命周期。在多个开发团队环境时,Maven 可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven 让开发人员的
2、工作更轻松,同时创建报表,检查,构建和测试自动化设置。Maven 提供了开发人员的方式来管理:1、Builds2、Documentation3、Reporting4、Dependencies5、SCMs6、Releases7、Distribution8、mailing list概括地说,Maven 简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven 增加可重用性并负责建立相关的任务。Maven 历史Maven 最初设计,是以简化 Jakarta Turbine 项目的建设。在几个项目,每个项目包含了不同的 Ant 构建文件。 JAR 检查到 CVS。Ap
3、ache 组织开发 Maven 可以建立多个项目,发布项目信息,项目部署,在几个项目中 JAR 文件提供团队合作和帮助。Maven 目标Maven 主要目标是提供给开发人员:1、项目是可重复使用,易维护,更容易理解的一个综合模型。2、插件或交互的工具,这种声明性的模式。Maven 项目的结构和内容在一个 XML 文件中声明,pom.xml 项目对象模型(POM),这是整个 Maven 系统的基本单元。有关详细信息,请参阅 Maven POM 的部分。Apache Maven 是一种创新的软件项目管理工具,提供了一个项目对象模型(POM)文件的新概念来管理项目的构建,相关性和文档。最强大的功能就
4、是能够自动下载项目依赖库。在本教程中,它提供了如何使用 Apache Maven 3.x 的许多实例和解释。Maven 安装和配置在 Windows 和 Ubuntu 的安装指南。 在 Windows 上安装 Maven有关如何在 Windows 上安装 Maven 的文章。 启用 Maven 的代理访问要使用代理服务器来连接互联网,必须在 Maven 配置代理设置。Maven 资源库Maven 位置,中央和远程存储库配置和解释,有些术语可能需要在 Maven 使用前理解。 Maven 本地资源库Maven 的本地资源库是用来存储项目的依赖库,默认的文件夹是 “.m2” 目录,可能需要将其更改
5、为另一个文件夹。 Maven 中央存储库Maven 中央存储库是 Maven 用来下载所有项目的依赖库的默认位置。 如何从 Maven 远程存储库下载?,如何添加远程库?并非所有的库存储在 Maven 的中央存储库,很多时候需要添加一些远程仓库来从其他位置,而不是默认的中央存储库下载库。 Maven 依赖机制这里的文章是关于传统方式和 Maven 方式的依赖库的不同,并说明 Maven 会从那里搜索这些库。 定制库到 Maven 本地资源库很多库仍然不支持 Maven 的 pom.xml 的概念,这里有一个指南来说明如何包括“非 Maven 支持”库到 Maven 本地资源库中。基于 Mave
6、n 项目和 Eclipse IDE实例是使用 Maven 创建 Java 项目和 Web 应用程序,以及演示如何将其导入到 Eclipse IDE 中。 使用 Maven 创建 Java 项目使用 Maven 来创建一个 Java 项目。 转换基于 Maven 的 Java 项目支持 Eclipse IDE指导转换基于 Maven 的 Java 项目来支持在 Eclipse IDE 中。 使用 Maven 创建 Web 应用程序项目使用 Maven 来创建 Web 应用程序项目。 转换基于 Maven 的 Web 应用程序支持 Eclipse IDEMaven 转换基于 Web 应用程序来支持
7、 Eclipse IDE 中指南。 使用 Maven 模板创建项目另外,您也可以从 Maven 的模板来创建标准项目。Maven 基本操作一些基本的操作,编译,构建,单元测试,安装,网站生成和基于 Maven 部署项目。 使用 Maven 构建项目“mvn package” 来构建项目 使用 Maven 清理项目“mvn clean” 来清理项目 使用 Maven 运行单元测试“mvn test” 来执行单元测试 将项目安装到 Maven 本地资源库“mvn install” 打包和部署项目到本地资源库 生成基于 Maven 的项目文档站点“mvn site” 来为您的项目生成信息文档站点 使
8、用“mvn site-deploy”部署站点(WebDAV 例子)“mvn site-deploy” 通过 WebDAV 部署自动生成的文档站点到服务器 部署基于 Maven 的 war 文件到 Tomcat“mvn tomcat:deploy” 以 WAR 文件部署到 Tomcat一、Maven 安装配置想要安装 Apache Maven 在 Windows 系统上, 需要下载 Maven 的 zip 文件,并将其解压到你想安装的目录,并配置 Windows 环境变量。所需工具 :1. JDK 1.82. Maven 3.3.33. Windows 7注Maven 3.2 要求 JDK 1.
9、6 或以上版本, 而 Maven 3.0/3.1 需要 JDK 1.5 或以上1. JDK 和 JAVA_HOME确保已安装 JDK,并 “JAVA_HOME” 变量已加入到 Windows 环境变量。操作要以按上面数字顺序,在这个教程中,安装的 JDK 是 JDK1.8,为了方便学习,建议你也安装使用 JDK1.8。2. 下载 Apache Maven访问 Maven 官方网站,打开后找到下载链接,如下:下载 Maven 的 zip 文件,例如: apache-maven-3.3.3-bin.zip,将它解压到你要安装 Maven 的文件夹。假设你解压缩到文件夹 D:apache-maven
10、注意:在这一步,只是文件夹和文件,安装不是必需的。3. 添加 M2_HOME 和 MAVEN_HOME添加 M2_HOME 和 MAVEN_HOME 环境变量到 Windows 环境变量,并将其指向你的 Maven 文件夹。M2_HOME 或 MAVEN_HOMEMaven 说只是添加 M2_HOME , 但一些项目仍引用 Maven 的文件夹 MAVEN_HOME, 因此,为了安全也把它添加进去。4. 添加到环境变量 - PATH更新 PATH 变量,添加 Maven bin 文件夹到 PATH 的最后,如: %M2_HOME%bin, 这样就可以在命令中的任何目录下运行 Maven 命令了
11、。5. 验证完成,以验证它,执行 mvn version 在命令提示符下,如下输出结果:C:UsersAdministratormvn -versionApache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T19:57:37+08:00)Maven home: D:apache-mavenJava version: 1.8.0_40, vendor: Oracle CorporationJava home: D:Program FilesJavajdk1.8.0_40Default locale: zh_
12、CN, platform encoding: GBKOS name: “windows 7“, version: “6.1“, arch: “amd64“, family: “dos“如果你看到类似消息,说明 Apache Maven 在 Windows 上已安装成功。二、Maven 启用代理访问如果你的公司正在建立一个防火墙,并使用 HTTP 代理服务器来阻止用户直接连接到互联网。如果您使用代理,Maven 将无法下载任何依赖。为了使它工作,你必须声明在 Maven 的配置文件中设置代理服务器:settings.xml.1. Maven 配置文件找到文件 M2_HOME/conf/setti
13、ngs.xml, 并把你的代理服务器信息配置写入。注:M2_HOME = D:apache-mavenM2_HOME/conf/|取消注释代理选项,填写您的代理服务器的详细信息。|2. 保存文件完成后,Apache Maven 应该是能够通过代理服务器立即连接到 Internet。注意:重新启动不是必需的。Maven 只是一个命令,当你调用它,它会再次读取该文件。三、Maven 本地资源库Maven 的本地资源库是用来存储所有项目的依赖关系(插件 jar 和其他文件,这些文件被 Maven 下载)到本地文件夹。很简单,当你建立一个 Maven 项目,所有相关文件将被存储在你的 Maven 本地
14、仓库。默认情况下,Maven 的本地资源库默认为 .m2 目录文件夹:1. Unix/Mac OS X /.m22. Windows C:Documents and Settingsyour-username.m21. 更新 Maven 的本地库通常情况下,可改变默认的 .m2 目录下的默认本地存储库文件夹到其他更有意义的名称,例如,maven-repo找到 M2_HOMEconfsetting.xml, 更新 localRepository 到其它名称。M2_HOMEconfsetting.xml/path/to/local/repoD:apache-mavenrepository2. 保存
15、文件执行之后,新的 Maven 本地存储库现在改为 D:apache-mavenrepository.执行命令:C:worksp mvn archetype:generate -DgroupId=com.yiibai -DartifactId=NumberGenerator -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false详见如下图:四、Maven 中央存储库当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载。首先,Maven 将从本地资源库获得 Ma
16、ven 的本地资源库依赖资源,如果没有找到,然后把它会从默认的 Maven 中央存储库 http:/repo1.maven.org/maven2/ 查找下载。Maven 的中央资源库网站是这样的:Maven 中心储存库网站已经改版本,目录浏览可能不再使用。这将直接被重定向到http:/search.maven.org/。这就好多了,现在有一个搜索功能:PS:目录浏览功能被禁用,但是,当你建立 Maven 的项目,它仍然会从 “http:/repo1.maven.org/maven/” 得到依赖, 您可以从 Maven 验证输出。五、如何从 Maven 远程存储库下载?根据 Apache Mav
17、en 的说明:Downloading in Maven is triggered by a project declaring a dependency that is not present in the local repository (or for a SNAPSHOT, when the remote repository contains one that is newer). By default, Maven will download from the central repository.在 Maven 中,当你声明的库不存在于本地存储库中,也没有不存在于 Maven 中心
18、储存库,该过程将停止并将错误消息输出到 Maven 控制台。1. 示例org.jvnet.localizer 只适用于 J 资源库pom.xmlorg.jvnet.localizerlocalizer1.8当你建立这个 Maven 项目,它将依赖找不到失败并输出错误消息。2. 声明 J 储存库告诉 Maven 来获得 J 的依赖,你需要声明远程仓库在 pom.xml 文件这样:https:/ 的依赖库查询顺序更改为:1. 在 Maven 本地资源库中搜索,如果没有找到,进入第 2 步,否则退出。2. 在 Maven 中央存储库搜索,如果没有找到,进入第 3 步,否则退出。3. 在 Maven
19、 的远程存储库搜索,如果没有找到,提示错误信息,否则退出。6、Maven 添加远程仓库默认情况下,Maven 从 Maven 中央仓库下载所有依赖关系。但是,有些库丢失在中央存储库,只有在J 或 JBoss 的储存库远程仓库中能找到。1. J 资源库添加 J 远程仓库的详细信息在“pom.xml”文件。https:/ “http:/ 仍然可用, 但建议升级到最新储存库。2. JBoss Maven 存储库1. 添加 JBoss 远程仓库的详细信息在 “pom.xml” 文件中。pom.xmlJBoss repositoryhttp:/repository.jboss.org/nexus/con
20、tent/groups/public/注意:旧的 http:/ 已过时,不再使用。7、Maven 依赖机制在 Maven 依赖机制的帮助下自动下载所有必需的依赖库,并保持版本升级。案例分析让我们看一个案例研究,以了解它是如何工作的。假设你想使用 Log4j 作为项目的日志。这里你要做什么?1.在传统方式1. 访问 http:/logging.apache.org/log4j/2. 下载 Log4 j 的 jar 库3. 复制 jar 到项目类路径4. 手动将其包含到项目的依赖5. 所有的管理需要一切由自己做如果有 Log4j 版本升级,则需要重复上述步骤一次。2. 在 Maven 的方式1.
21、你需要知道 log4j 的 Maven 坐标,例如:log4jlog4j1.2.142.3.它会自动下载 log4j 的 1.2.14 版本库。如果“version”标签被忽略,它会自动升级库时当有新的版本时。4.5. 声明 Maven 的坐标转换成 pom.xml 文件。log4jlog4j1.2.146.7. 当 Maven 编译或构建,log4j 的 jar 会自动下载,并把它放到 Maven 本地存储库8. 所有由 Maven 管理解释说明看看有什么不同?那么到底在 Maven 发生了什么?当建立一个 Maven 的项目,pom.xml 文件将被解析,如果看到 log4j 的 Mave
22、n 坐标,然后 Maven 按此顺序搜索 log4j 库:1. 在 Maven 的本地仓库搜索 log4j 2. 在 Maven 中央存储库搜索 log4j3. 在 Maven 远程仓库搜索 log4j(如果在 pom.xml 中定义)Maven 依赖库管理是一个非常好的工具,为您节省了大量的工作。如何找到 Maven 坐标?访问 Maven 中心储存库,搜索下载您想要的 jar。八、定制库到 Maven 本地资源库这里有 2 个案例,需要手动发出 Maven 命令包括一个 jar 到 Maven 的本地资源库。1. 要使用的 jar 不存在于 Maven 的中心储存库中。2. 您创建了一个自
23、定义的 jar ,而另一个 Maven 项目需要使用。PS,还是有很多 jar 不支持 Maven 的。案例学习例如,kaptcha,它是一个流行的第三方 Java 库,它被用来生成 “验证码” 的图片,以阻止垃圾邮件,但它不在 Maven 的中央仓库中。在本教程中,我们将告诉你如何安装 “kaptcha” jar 到 Maven 的本地资源库。1. mvn 安装下载 “kaptcha”,将其解压缩并将 kaptcha-version.jar 复制到其他地方,比如:C 盘。发出下面的命令:mvn install:install-file -Dfile=c:kaptcha-version.jar
24、 -DgroupId=com.google.code -DartifactId=kaptcha -Dversion=version -Dpackaging=jar示例:D:mvn install:install-file -Dfile=c:kaptcha-2.3.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion=2.3 -Dpackaging=jarINFO Scanning for projects.INFO Searching repository for plugin with prefix: install.INF
25、O -INFO Building Maven Default ProjectINFO task-segment: install:install-file (aggregator-style)INFO -INFO install:install-fileINFO Installing c:kaptcha-2.3.jar to D:maven_repocomgooglecodekaptcha2.3kaptcha-2.3.jarINFO -INFO BUILD SUCCESSFULINFO -INFO Total time: com.google.codekaptcha2.33. 完成构建它,现在
26、 “kaptcha” jar 能够从你的 Maven 本地存储库检索了。九、使用 Maven 创建 Java 项目在本教程中,我们将向你展示如何使用 Maven 来创建一个 Java 项目,导入其到 Eclipse IDE,并打包 Java 项目到一个 JAR 文件。所需要的工具:1. Maven 3.3.32. Eclipse 4.23. JDK 8注意:请确保 Maven 是正确安装和配置(在 Windows,*nix,Mac OSX 系统中),然后再开始本教程,避免 mvn 命令未找到错误。1. 从 Maven 模板创建一个项目在终端(* UNIX 或 Mac)或命令提示符(Window
27、s)中,浏览到要创建 Java 项目的文件夹。键入以下命令:mvn archetype:generate -DgroupId=project-packaging -DartifactId=project-name-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false这告诉 Maven 来从 maven-archetype-quickstart 模板创建 Java 项目。如果忽视archetypeArtifactId 选项,一个巨大的 Maven 模板列表将列出。例如,这里的工作目录是:C:worksp,执
28、行命令过程时间可能比较久,看个人的网络状况。C:workspmvn archetype:generate -DgroupId=com.yiibai -DartifactId=NumberGenerator -DarchetypeArtifactId=maven -archetype-quickstart -DinteractiveMode=falseINFO Scanning for projects.INFOINFO -INFO Building Maven Stub Project (No POM) 1INFO -INFOINFO maven-archetype-plugin:2.4:ge
29、nerate (default-cli) generate-sources standalone-pom INFOINFO mvn eclipse:eclipse.INFO Using Eclipse Workspace: nullINFO Adding default classpath container: org.eclipse.jdt.launching.JRE_CONTAINERINFO Not writing settings - defaults sufficeINFO Wrote Eclipse project for “NumberGenerator“ to C:worksp
30、NumberGenerator.INFOINFO -INFO BUILD SUCCESSINFO -INFO Total time: 04:47 minINFO Finished at: 2015-10-27T15:24:48+08:00INFO Final Memory: 15M/164MINFO -执行以上命令后,它自动下载更新相关资源和配置信息(需要等待一段时间),并产生 Eclipse IDE所要求的所有项目文件。要导入项目到 Eclipse IDE 中,选择 “File - Import - General-Existing Projects into Workspace”图片: 项
31、目导入到 Eclipse IDE 中。4. 更新 POM默认的 pom.xml 太简单了,很多时候,你需要添加编译器插件来告诉 Maven 使用哪个 JDK 版本是用来编译项目。(默认 JDK1.4,这的确太旧了点)org.apache.maven.pluginsmaven-compiler-plugin2.3.21.61.6从更新 JUnit 3.8.1 到最新的 4.11。junitjunit4.11testMaven 坐标上面的 XML 代码片段被称为“Maven 坐标”,如果你需要 JUnit 的 jar,你需要找出其相应的 Maven 坐标。它适用于所有其他的依赖,如 Spring,
32、Hibernate,Apache 普通的等,只要到 Maven 中心储存库,并找出哪些是依赖正确的 Maven 坐标。pom.xml 更新版本4.0.0com.mkyongNumberGeneratorjar1.0-SNAPSHOTNumberGeneratorhttp:/maven.apache.orgjunitjunit4.11testorg.apache.maven.pluginsmaven-compiler-plugin2.3.21.61.6在终端,再次发出同样的命令 mvn eclipse:eclipse ,Maven 将从 Maven 中心储存库下载插件项目依赖关系(JUnit),
33、它会自动保存到你的本地仓库。5. 更新业务逻辑测试驱动开发(TDD),先更新单元测试,以确保应用程序(APP)对象有一个方法来生成包含恰好 36位字母表的唯一密钥。AppTest.javapackage com.yiibai;import org.junit.Assert;import org.junit.Test;public class AppTest Testpublic void testLengthOfTheUniqueKey() App obj = new App();Assert.assertEquals(36, obj.generateUniqueKey().length();完成业务逻辑。App.javapackage com.yiibai;import java.util.UUID;/* Generate a unique number*/public class App public static void main( String args )App obj = new App();System.out.println(“Unique ID : “ + obj.generateUniqueKey();public String generateUniqueKey()