« JavaFX博客大赛 | Main | 一个简单的JavaFX Deliciou... »
http://developers.sun.com.cn/blog/functionalca/date/20090624 星期三 2009年06月24日

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]
评论:

发表一条评论:
  • HTML语法: 禁用