Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具 。 目前,绝大多数开发人员都把 Ant 当作 Java 编程项目的标准构建工具。遗憾的是,Ant 的项目管理工具(作为 make的替代工具)不能满足绝大多数开发人员的需要。通过检查 Ant 构建文件,很难发现项目的相关性信息和其它元信息(如开发人员/拥有者、版本或站点主页)。 Maven 除了以程序构建能力为特色之外,还提供 Ant 所缺少的高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目,而使用 Ant 则需要十几行。事实上,由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目现在使用 Maven,而且公司项目采用 Maven 的比例在持续增长。 Maven这个单词来自于意第绪语,意为知识的积累,最早在Jakata Turbine项目中它开始被用来试图简化构建过程。当时有很多项目,它们的Ant build文件仅有细微的差别,而JAR文件都由CVS来维护。于是Maven创始者开始了Maven这个项目,该项目的清晰定义包括,一种很方便的发布项目信息的方式,以及一种在多个项目中共享JAR的方式。 [1]
用maven的好处:我感觉最主要就是自动下载jar包和它所依赖的包,这样可以保证了多人开发时jar版本不同的问题。再就是文件结构清晰,java文件,资源文件,测试文件都分的很清楚。
那么,Maven 和 Ant 有什么不同呢?在回答这个问题以前,我要强调一点:Maven 和 Ant 针对构建问题的两个不同方面。Ant 为 Java 技术开发项目提供跨平台构建任务。Maven 本身描述项目的高级方面,它从 Ant 借用了绝大多数构建任务。因此,由于 Maven 和 Ant 代表两个差异很大的工具,所以我将只说明这两个工具的等同组件之间的区别,如表 1 所示。[1] Maven是一个项目管理工具 ,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期 (Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件 (plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。 Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。 此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。
mvn archetype:create 创建Maven项目
mvn compile 编译源代码
mvn test-compile 编译测试源代码
mvn test 运行应用程序中的单元测试
mvn site 生成项目相关信息的网站
mvn clean 清除项目目录中的生成结果
mvn package 根据项目生成的jar
mvn install 在本地Respository中安装jar
mvn eclipse:eclipse 生成eclipse项目文件
mvn jetty:run 启动jetty服务
mvn tomcat:run 启动tomcat服务
目前中文版对maven介绍比较全的书籍是《Maven实战》
现在Java新架构的不断出现,例如Struts,Spring,Hibernate等,项目的配置文件的增多,给开发人员带来很大麻烦。在实际的开发当中,Myeclipse中的project越来越庞大,所依赖的第三方Jar包越来越多,这显得Project很臃肿,给项目管理带来了很大不便,尤其是在一些大型项目。为了解决上述问题,Apache开源组织发布了Maven[2] ,它适用于大的Java项目。
1. Maven有一个重要的文件"settings.xml“,这个文件来源于apache-maven-2.0.8/conf/ 下,要放在windows下, Win7和Winxp还是有点不一样 , Win7 ---C:\Users\用户名\.m2 , Winxp ---C:\Documents and Settings\用户名\.m2 。
2. 设置Maven的环境变量,基本上和设置Jdk环境变量相似,首先设置MAVEN_HOME,再加入Path 。
3. 修改”settings.xml” 文件,在这个文件中找到<localRepository></localRepository>这一行,修改为<localRepository>${MAVEN_HOME}/repo</localRepository>。这一行代表了Maven的本地Jar包仓库的位置,下面放的都是项目所用到的jar包。
其中 <servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
这个是配置私服,也就是远程服务器,当本地服务器不含有该JAR包时系统就自动去找,如果找到就从远程服务器上下载到本地服务器。如果是整个公司开发项目的话,最好配置私服,这样每个项目的使用者都可以从这里下载JAR包,保证了JAR包版本的统一且方便管理。
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>central</mirrorOf>
<url>http://172.17.26.73:9091/nexus/content/groups/public</url> <!-- 这个是私服的地址-->
</mirror>
</mirrors>
如果所需要的JAR包是工程内部自己生成的供使用的,可以把它安装到本地仓库中,
mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file(JAR包路径)
如果需要把这些JAR包上传到私服上:
mvn deploy:deploy-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=http://xxx.ss.com/sss.xxx -DrepositoryId=release-repo
也可以去私服相应的管理页面,如在这里相应为:http://172.17.26.73:9091/nexus/index.html
按如下步骤:
第一步:点Repositories
第二步:点3rd party
第三步:点Artifact Upload,然后GAV Definition中选 GAV Parameters,Group,Artifact,Version可以自己设置名字,一般与JAR包名称相同
第四步:选择JAR包所在位置,其中Classifier可以不填,如果填的话表示相同JAR包名称的不同版本(区别于Version,比如有的JAR包相对应有JDK1.4版本,有的有1.5版本)
第五步:添加JAR包,然后点UploadArtifact就上传成功了。上传成功后点Refresh就可以看到刚上传的JAR包
想看上传的JAR包的POM信息,可以点Browse Storage,然后找到相应的文件夹,右边就可以显示相应的POM信息
4.安装maven插件
Eclipse->help->Install New Software, 弹出安装对话框
点击 Add 按钮,按图示输入,确定
接下来按提示一直 next 下去,直到安装完毕。
5 点Windows-->Preference ,然后找到Maven,再找到Installations,点Add,找到Maven的安装位置,如果已经有则就 不用再添加
6. 建立Maven的project,File--new—other—Java Maven Project
1)选择WorkSpace路径,点下一步
2)Catalog选择Install, filter填webapp,再下面找到 maven-archetype-webapp, 点下一步
3)填写相应的GroupId,Artifact信息,Artifact一般为项目名称。version可以把后面的SNAPSHOT去掉,点FINISH
7 右键点项目,点属性--> project facets --> 在Project Facet 中的 Dynamic Web Module,Java,JavaScript三个前面打勾,其中Dynamic Web Module 选择 Version 版本为2.5,然后点OK。
8 设置部署程序集
右键点项目,点属性--> Deployment Assembly
此处列表是,部署项目时,文件发布的路径。
1,我们删除test的两项,因为test是测试使用,并不需要部署。
2,设置将Maven的jar包发布到lib下。
Add -> Java Build Path Entries -> Maven Dependencies -> Finish
9 向 maven 项目中添加 jar 包
maven 可以管理项目依赖的 jar 包,通过 groupID 、 artifactId 以及版本号可以唯一确定一个 jar 包。这样可以防止老式 Web 项目中 WEB-INF/lib 下 jar 包不一致的问题。并且 maven 还会自动下载添加进的 jar 包所依赖的 jar 包。
9.1 在pom.xml中添加所需要的jar包
使用Maven POM editor打开项目中的pom.xml文件,选择Dependencies,在Dependencies栏目点击Add进行,首先弹出一个搜索按钮,例如输入spring,就会自动搜索关于spring的jar包,或者点击pom.xml直接编辑pom.xml文件。这样可以直接copy过来 dependencies内容。如下图
当添加进入一个 jar 包后,有一些属性需要设置,最重要的就是 scope ,它有以下几种取值:
1. compile ,缺省值,适用于所有阶段,会随着项目一起发布。
2. provided ,类似 compile ,期望 JDK 、容器或使用者会提供这个依赖。如 servlet.jar 。
3. runtime ,只在运行时使用,如 JDBC 驱动,适用运行和测试阶段。
4. test ,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
5. system ,类似 provided ,需要显式提供包含依赖的 jar , Maven 不会在 Repository 中查找它。
点OK,就引入该JAR包了,在POM文件中可以看到相应的XML代码。
如果jar包或版本没有找到的话,可以去网站http://mvnrepository.com/ 查找。
10 POM概述
<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 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>xinhua</groupId> <artifactId>QuickRegister</artifactId> <packaging>war</packaging> <version>0.0.1</version> <name>QuickRegister Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 为POM设置编码格式 --> </properties> <dependencies> <!-- 建立依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <distributionManagement> <!-- 设置私服,id 对应 setting 中的私服 id --> <repository> <id>nexus</id> <name>nexus</name> <url>http://172.17.26.73:9091/nexus/content/groups/public</url> </repository> <snapshotRepository> <!-- 表示的是快照的地址 --> <id>nexus</id> <name>nexus</name> <url>http://172.17.26.73:9091/nexus/content/groups/public</url> </snapshotRepository> </distributionManagement> <build> <finalName>QuickRegister</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <!-- Run As Maven build : clean package 就可以发布到tomcat下了,并按照<warName>命名 --> <!-- 访问应用时,访问该地址即可:http://IP:Port/warName/ --> <warName>QuickRegister</warName> <outputDirectory>E:\tomcat6\apache-tomcat-6.0.35\webapps</outputDirectory> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.2</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <version>1.1</version> <configuration> <url>http://localhost:8080/manager/html</url> <username>admin</username> <password>admin</password> </configuration> </plugin> </plugins> </build> </project>
11. 到现在为止,环境就算搞定了。
这时候右键点项目,点Run-->As ,会看到多出几个Maven的命令,如果需要的命令没有在里面,可以自己添加。
点Build...,然后在对话框中的Goals 中输入相应的Maven命令,如clean package
12.如果是Dynamic Web project项目转成Maven项目方法参见文章http://woshixushigang.iteye.com/blog/1290575
1 执行mvn tomcat:run时报错
java.lang.ClassCastException: org.springframework.web.servlet.DispatcherServlet cannot be cast to javax.servlet.Servlet
问题出在servlet-api.jar上,tomcat部署springMVC项目时是不用这个包的,而用maven构建项目时需要,如果不引用该依赖就会不识别 HttpServletRequest等的类
解决方法是在maven引用servlet的依赖时,加上属性范围<scope>provided</scope>
依赖范围(scope) | 主源码classpath可用 | 测试源码classpath可用 | 会被打包 |
compile 缺省值 | TRUE | TRUE | TRUE |
test | FALSE | TRUE | FALSE |
runtime | FALSE | TRUE | TRUE |
provided | TRUE | TRUE | FALSE |