Maven 快速入门
作者:曹祺
Blog: http://blogs.sun.com/greysh
Web: http://www.greysh.com
Email: Qi.Cao@Sun.com
本文链接:
http://developers.sun.com.cn/blog/functionalca/entry/maven_%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8
难度:入门
Maven是基于项目对象模型(POM)的项目构建工程,和ANT相比,他能自动生成网站版文档,自动寻找依赖构建和生成测试文件。毕竟不是每台电脑上都有eclipse或者netbans这些ide的,但是如果所有的编译都在命令行去人工处理将是一件很繁琐的事情,这也是为什么需要这些项目构建工具的原因
Maven用起来有几个很方便的地方,当发现缺少某个jar的库会自动去下载,类似于linux的apt-get install,会自动从源里面找,然后构建的时候会自动生成项目和测试。如果发布文档可以生产文档网站,而这些都属于maven的生命周期.
构建环境
从http://maven.apache.org 下载最新的版本,然后添加环境变量M2_HOME,指向MAVEN解压缩后的目录。并在PATH里面添加MAVEN解压缩目录的BIN目录。开启一个DOS窗口,输入mvn -version如果能打印出Apache Maven 2.1.0则配置正确.
MAVEN默认会在”我的文档”创建一个.m2的repository,用来缓存缺少的jar目录,因此第一次构建项目有时因为要从远程下载依赖的jar会消耗比较多的时间。
创建项目
比如启动一个dos窗口进入切换到D盘根目录,在DOS提示符输入
mvn archetype:create -DgroupId=com.greysh.mvn -DartifactId=HelloWorld
如果成功会有以下提示信息
D:\>mvn archetype:create -DgroupId=com.greysh.mvn -DartifactId=HelloWorld
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [archetype:create] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus
.velocity.ContextClassLoaderResourceLoader'.
[INFO] Setting property: velocimacro.messages.on => 'false'.
[INFO] Setting property: resource.loader => 'classpath'.
[INFO] Setting property: resource.manager.logwhenfound => 'false'.
[INFO] [archetype:create]
[WARNING] This goal is deprecated. Please use mvn archetype:generate instead
[INFO] Defaulting package to group ID: com.greysh.mvn
[INFO] artifact org.apache.maven.archetypes:maven-archetype-quickstart: checking
for updates from central
[INFO] -------------------------------------------------------------------------
---
[INFO] Using following parameters for creating OldArchetype: maven-archetype-qui
ckstart:RELEASE
[INFO] -------------------------------------------------------------------------
---
[INFO] Parameter: groupId, Value: com.greysh.mvn
[INFO] Parameter: packageName, Value: com.greysh.mvn
[INFO] Parameter: package, Value: com.greysh.mvn
[INFO] Parameter: artifactId, Value: HelloWorld
[INFO] Parameter: basedir, Value: D:\
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] ********************* End of debug info from resources from generated POM
***********************
[INFO] OldArchetype created in dir: D:\HelloWorld
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7 seconds
[INFO] Finished at: Wed Jun 24 20:59:46 CST 2009
[INFO] Final Memory: 8M/254M
[INFO] ------------------------------------------------------------------------
然后D盘出出现一个HelloWorld的文件夹,文件结构如下
D:\HelloWorld>tree/f
文件夹 PATH 列表
卷序列号为 7474-C78C
D:.
│ pom.xml
│
└─src
├─main
│ └─java
│ └─com
│ └─greysh
│ └─mvn
│ App.java
│
└─test
└─java
└─com
└─greysh
└─mvn
AppTest.java
刚才输入的mvn archetype:create -DgroupId=com.greysh.mvn -DartifactId=HelloWorld
期中 DgroupId代表你的项目package,后面的artifactId代表你的工程文件夹名。生成的App.java便是Helloworld文件,AppTest是测试文件,默认采用的Junit.而POM.XML则是项目对象模型的配置文件,类似ant的build.xml
MAVEN一共有以下默认生命周期(lifecycle),运行都用mvn后输入指定的生命周期,比如指定打包,就输入mvn package,其他也类似
validate: 检测工程是不是配置争取,必要信息都有
compile: 编译工程
test: 测试,也就是AppTest的测试
package: 比如ejb工程,用这个命令就可以打包成jar文件
integration-test: 集成测试
verify: 校验包是否符合要求
install: 把生成的包部署到本地仓库或者作为本期其他工程的一个库
deploy: 集成测试完后部署到远程
还有两个不属于默认生命周期,但是很常用
site:生成文档网站
clean:清理生成中不需要的部分,比如用mvn site生成网站文档后又不想要了,可以用mvn clean清理生成的site
然后打开刚才生成的Helloworld,发现里面代码如下
package com.greysh.mvn;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}
我们去运行的时候,先要编译整个项目输入如下
D:\HelloWorld>mvn package
然后会提示
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building HelloWorld
[INFO] task-segment: [package]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources]
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e
. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\HelloWorld\src\main\resources
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\HelloWorld\target\classes
[INFO] [resources:testResources]
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e
. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\HelloWorld\src\test\resources
[INFO] [compiler:testCompile]
[INFO] Compiling 1 source file to D:\HelloWorld\target\test-classes
[INFO] [surefire:test]
[INFO] Surefire report directory: D:\HelloWorld\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.greysh.mvn.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.093 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] [jar:jar]
[INFO] Building jar: D:\HelloWorld\target\HelloWorld-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7 seconds
[INFO] Finished at: Wed Jun 24 21:11:49 CST 2009
[INFO] Final Memory: 14M/254M
[INFO] ------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
可以开出运行过一次单元测试
此时文件结构变为
D:.
│ pom.xml
│
├─src
│ ├─main
│ │ └─java
│ │ └─com
│ │ └─greysh
│ │ └─mvn
│ │ App.java
│ │
│ └─test
│ └─java
│ └─com
│ └─greysh
│ └─mvn
│ AppTest.java
│
└─target
│ HelloWorld-1.0-SNAPSHOT.jar
│
├─classes
│ └─com
│ └─greysh
│ └─mvn
│ App.class
│
├─maven-archiver
│ pom.properties
│
├─surefire-reports
│ com.greysh.mvn.AppTest.txt
│ TEST-com.greysh.mvn.AppTest.xml
│
└─test-classes
└─com
└─greysh
└─mvn
AppTest.class
而helloWorld-1.0-SNAPSHOT.jar就是打包后生成的jar文件,运行只需要输入
D:\HelloWorld>java -cp target/HelloWorld-1.0-SNAPSHOT.jar com.greysh.mvn.App
如果能打印除来Hello World!则表示运行成功
如果要生成网站,输入
mvn site
会发现target目录里面多了一个site目录
点击site的index.html就是生存的文档网站,类似javadoc
如果要清理site,输入
mvn clean
然后去看工程文件夹是不是就只有src和pom.xml
如果要生成eclipse工程输入
mvn eclipse:eclipse
然后就可以直接导入到eclipse
总体感觉mvn要比ant方便很多,也许这也是为什么越来越多的工程源代码的release采用maven的原因吧,比如appfuse的构建采用maven构建JavaEE项目。
发表于 Sun Functional 校园大使 [JavaEE] ( 六月 24, 2009 09:02 下午 ) Permalink | 评论[0]
