• 1. Apache Maven 3培训
  • 2. 目录项目开发中疑问 什么是maven 为什么要使用maven maven和ant的区别 maven安装 一个使用maven的例子 资源库和依赖 POM文件 maven插件 常见用法 源码目录结构 maven配置 pom文件设置例子
  • 3. 项目开发中疑问都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 为什么在我的机器上可以正常打包,而QA配置管理员却打不出来? 项目组加入了新的人员,我要给他说明编译环境如何设置,但是让我挠头的是,有些细节我也记不清楚了。 我的项目依赖一些jar包,我应该把他们放哪里?放源码库里? 这是我开发的第二个项目,还是需要上面的那些jar包,再把它们复制到我当前项目的svn库里吧 现在是第三次,再复制一次吧 ----- 这样真的好吗? 老板让我修改半年前完成的一个项目的bug,经过分析,这个bug是某个第三方库的bug导致的,我已经找到了第三方库源码错误的位置,只要重新编译并替换第三方库就可以了,但是问题是,我不知道我引用的是什么版本的第三方库,不知道用最新版本会不会有兼容性问题。 我写了一个数据库相关的通用类,并且推荐给了其他项目组,现在已经有五个项目组在使用它了,今天我发现了一个bug,并修正了它,我会把jar包通过邮件发给其他项目组 -----这不是一个好的分发机制,太多的环节可能导致出现bug 使用maven可以解决上面的问题
  • 4. 什么是mavenmaven是一个用于java项目管理和自动构建的软件工具。 它诞生于2002年,它和Apache ant用起来很类似,但是它们的基本设计概念很不相同。 maven是Apache Software Foundation的组成部分,之前是Jakarta Project的组成部分。 maven使用POM(project object model)来描述和构建软件项目,它依赖其他的扩展模块和组件。 maven的一个重要特性是网络化。只要使用者能连接intenet, maven就会自动的在需要的时候从一个或多个资源库下载需要的plugin和软件包。 maven基于插件的设计模式,使用不同的插件可以支持不同的语言,现在有.net的插件,也有C/C++的插件。
  • 5. 为什么要使用maven协同开发的基本规范,为大家提供方便的协作的模式,能增加代码的复用,提高生产率。 提供方便,规范化的打包方法,是公司完成自动构建系统的核心部分,能帮助提高敏捷开发的效率(敏捷开发提倡尽早集成)。 减少冗余,减少出错的可能。 中心资源库管理,能减低源码库的大小,中心资源库可以统一定期备份。 目录结构规范,让开发者从一个maven项目过度到另一maven项目很容易。 大量的开源项目使用了maven。
  • 6. maven和ant的区别1ant脚本是可以直接运行在maven中的。maven和ant最大的差别就是在于maven的编译以及所有的脚本都有一个基础,就是POM(project object model)。这个模型定义了项目的方方面面,然后各式各样的脚本在这个模型上工作,而ant完全是自己定义,显然maven更胜一筹。 maven对所依赖的包有明确的定义,如使用那个包,版本是多少,一目了然。而ant则通常是简单的inclde 所有的jar。导致的最终结果就是,你根本无法确定项目中的lib下的common-logging 是哪个版本的,唯一的方法就是打开 META-INF 目录下MANIFEST.MF。
  • 7. maven和ant的区别2maven是基于中央仓库的编译,即把编译所需要的资源放在一个中央仓库里,如jar,tld,pom,等。当编译的时候,maven会自动在仓库中找到相应的包,如果本地仓库没有,则从设定好的远程仓库中下载到本地。这一切都是自动的,而ant需要自己定义了。这个好处导致的结果就是,用maven编译的项目在发布的时候只需要发布源码,小得很,而反之,ant的发布则要把所有的包一起发布,显然maven又胜了一筹。 maven有大量的重用脚本可以利用,如生成网站,生成javadoc,sourcecode reference,等。而ant都需要自己去写。试试 maven site 的效果。 目前使用maven最好的方法还是命令行,又快又方便,当然现在的一些应用开发工具已经集成了成熟的GUI界面,如:eclipse,myEclipse,不过要集成maven插件。建议:新上手maven时,尽量用命令熟悉。
  • 8. maven安装前提条件:本地必须已经安装JDK, 并正确设置JAVA_HOME环境变量 本次培训使用的JDK版本为1.6.0_25 为了演示myEclipse效果,本地还需要安装myEclipse(推荐版本6.5,10.0) 下载http://maven.apache.org/download.html 本次培训使用的maven版本为3.0.4 把下载包解压的本地磁盘某路径,假设为C:\Program Files\Java\apache-maven-3.0.4 设置环境变量M2_HOME为C:\Program Files\Java\apache-maven-3.0.4 在环境变量PATH里加上C:\Program Files\Java\apache-maven-3.0.4 \bin或%M2_HOME%\bin 然后打开cmd窗口,执行命令mvn -v,如果获得类似以下的输出,即算安装成功 C:\Documents and Settings\Administrator>mvn -v Apache Maven 3.0.4 (r1232337; 2012-03-07 03:10:27+0800) Java version: 1.6.0_25 …
  • 9. maven安装(M2_HOME)
  • 10. maven安装(Path)
  • 11. maven安装(mvn-v)
  • 12. maven安装- settings.xml配置Maven安装成功后,有必要对conf文件夹下的settings.xml进行配置,我这的路径是:C:\Program Files\Java\apache-maven-3.0.4\conf\settings.xml 打开settings.xml,找到如下字眼: 改成如下方式: D:\java\maven3_repo 作用:主要是配置本地的仓库路径,我这设置的是:D:\java\maven3_repo,大家可以改成自己想要的路径,如果不改配置的话默认路径是:C:\Documents and Settings\Administrator\.m2\repository,所以建议修改,以免影响计算机使用速度。
  • 13. maven安装(本地仓库包)
  • 14. maven安装,仓库变量设置M2_REPO完成了settings.xml设置后,设置环境变量M2_REPO为D:\java\maven3_repo(按照自己实际情况设置),设置之后会同步更新到myEclipse工具当中。
  • 15. 一个使用maven的例子1用maven创建一个java类库的项目 在d盘创建一个目录work,进入cmd窗口,进入d:\work目录 执行mvn archetype:create -DgroupId=com.banger -DartifactId=myutil, 如果获得类似下面的输出表示成功: [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2 seconds [INFO] Finished at: Tue May 19 17:21:19 CST 2012 [INFO] Final Memory: 7M/14M [INFO] ------------------------------------------------------------------------ 其中archetype是plugin,create是方法,groupId,arifactId决定资源在源码库的位置。 如果你未进行任何配置,maven会到公网中心资源库去下载一些插件和包(http://repo1.maven.org/maven2) 关于章节。只有第一次的时候才下载,下载以后会缓存到本地,本地资源库的默认位置在${HOME}/.中心资源库和如何配置可以参看后面m2
  • 16. 一个使用maven的例子2查看d:\work目录,可以看到myutil目录,和下面的文件,其中pom.xml文件是项目描述文件,src目录源码目录,已经按一定格式创建好了 为了在 eclipse中编辑此项目,通过命令生成eclipse项目文件 在d:\work\myutil下执行mvn eclipse:eclipse 检查d:\work\myutil目录,可以发现.project和.classpath项目文件,如果需要重新生成,可以执行mvn eclipse:clean再重复上一步骤 把此项目import到eclipse中,在com.banger下加一个类myutil 类里加一个方法,如下: package com.banger; public class myutil { public static String getHelloWorlString(){ return "Hello world!"; } }
  • 17. 一个使用maven的例子3注意在eclipse需要设置eclipse一个class变量M2_REPO (在window-Preference-java-Build Path-ClassPath Variable里new一个变量M2_REPO,值设置为 C:\Documents and Settings\Administrator\.m2 主要参考maven本地资源库在哪里 ) 进入cmd,d:\work\myutil目录中 编译:mvn compile 打包: mvn package( jar包在target目录里 ) 发布到本地资源库: mvn install(查看本地资源库,会发现在对应目录有个myutil的jar包)
  • 18. 一个使用maven的例子4新建另外一个myapp项目依赖此myutil 在d:\work下新建一个目录myapp,把d:\work\myutil\pom.xml复制到该目录下(可以不用mvn的命令来创建pom文件和目录,把已经存在的pom文件拿来修改,自己手工创建目录也很方便) 用编辑器打开pom.xml,修改artifactId为myapp,name为myapp,把依赖修改为 com.banger myutil 1.0 手工创建目录src/main/java, src/test/java
  • 19. 一个使用maven的例子5在d:\work\myapp下执行mvn eclipse:eclipse 打开eclipse把d:\work\myapp项目加入workspace,查看myapp项目确认没有编译错误 新建目录src/main/java/com/banger 在上面的目录里新建类myapp,类代码如下: package com.banger; import com.banger.myutil; public class myapp { public static void main( String args[] ){ System.out.println( myutil.getHelloWorlString() ); } } 编译没有错以后,测试执行,能在控制台上看到Hello world!提示 这样就通过maven协作了两个项目,一个依赖另外一个
  • 20. 资源库和依赖依赖:groupId(公司,组织名), artifactId:项目名 它们决定了资源的存放目录 本地资源库和远程资源库对应,需要的库会从远程下载到本地缓存 远程资源库默认在http://repo1.maven.org/maven2,可以配置其他中心资源库 本地资源库默认在${home}/.m2,可以配置到其他地方 如果版本写SNAPSHOT表示取最新的版本
  • 21. POM文件POM是 “Project Object Model”的缩写 它代表一个项目,所有项目相关的东西都在这里定义。它有项目的名称,依赖等关键信息,也可以配置如何打包,如何发布等,如何测试等。 查看pom文件的详细定义参考 http://maven.apache.org/pom.html
  • 22. Maven插件1Maven的所有动作都是通过插件来完成的,在之前完成的例子里 mvn archetype:create … archetype就是插件,create是插件的方法 mvn compile 对应 compiler:compile mvn package 对应 jar:jar mvn install 对应 install:install 查询http://maven.apache.org/plugins/可以知道maven支持的插件和详细信息
  • 23. Maven插件2Pom文件里也可以配置插件,比如在project/build/plugins下面配置 org.apache.maven.plugins maven-compiler-plugin 2.0.2 1.6 1.6 UTF-8 表示本项目使用jdk1.6进行编译,源码文件为UTF-8,当需要时,maven会自动下载此插件
  • 24. 常见用法1创建空项目:mvn archetype:create -DgroupId=com.banger -DartifactId=myapp 列出所有可能的项目模板:mvn archetype:generate 通过pom文件生成eclipse项目文件: mvn eclipse:eclipse 根据pom文件产生eclipse项目文件 mvn eclipse:eclipse 删除maven生成的项目文件 mvn eclipse:clean
  • 25. 常见用法2编译mvn compile 打包mvn package 发布到本地资源库mvn install 发布到远程资源库mvn deploy(需要配置远程发布方式) 清除编译临时文件:mvn clean 测试:mvn test mvn assembly:assembly打出一个所有依赖包都存在的打包(类似fatjar)(还需pom文件里有正确的配置) mvn source:jar打源码包(依赖也能指定下载源码,可以使调试开发更加方便)
  • 26. 源码目录结构1maven项目有统一的目录结构 普通项目 src/main/java:源码目录 src/test/java:测试源码目录 target:编译结果目录
  • 27. 源码目录结构2WTP项目 src/main/java:源码目录 src/main/resources:资源目录(如存放log4j.xml) src/main/webapp:web目录 src/test/java:测试源码目录 src/test/resources:测试资源目录 target:编译结果目录 如果是手工复制pom文件创建的maven项目,记得自己手工创建相应目录
  • 28. Maven配置maven的配置分全局配置和用户配置 全局配置在${m2_home}/conf/setting.xml 用户配置在${home}/.m2/setting.xml(可以没有) 配置文件的具体意义可以参考,下面列几个关键的http://maven.apache.org/ref/2.1.0/maven-settings/settings.html /settings/localRepository:本地资源库的位置,可以找一个磁盘大点的盘 /settings/servers里可以配置用户名密码 /settings/profiles里可以配置定制的局域网中心资源库
  • 29. POM文件设置例子使用JDK1.6编译,并且源码文件使用UTF-8 让mvn deploy能发布到中心资源 (需要setting.xml里配对用户名密码) 配置pom文件,以便使用mvn assembly:assembly打出包含所有依赖的打包