maven能给你带来什么?
(这段话属转贴)学会使用maven2了,那么一切就变得简单起来了,一行命令mvn deploy,或者一个ant task,就让所有的事情都完成了。如果你想查看项目的进度,如果你想发布一个用户站点,那么mvn site可以很好的帮助你。然而更为方便的是,你不要到处去寻找那些类库了,到处的复制,粘贴,有时候还得为一个jar包的不同版本冲突忙上半天。有了maven,就有了统一的开发库,所有的jar都统一管理。不用再担心了。
maven2带来的不仅是方便,对于整个项目的监控也是不错的。有了统一的入口,加上完善的report组件,可以清晰地看到项目的所有进展。再加上continuum的持续整合,能减少很多成本。
maven2带来的不仅是方便,对于整个项目的监控也是不错的。有了统一的入口,加上完善的report组件,可以清晰地看到项目的所有进展。再加上continuum的持续整合,能减少很多成本。
安装
1. Download and extract latest version maven zip
2. Set JAVA_HOME
3. Set M2_HOME and add %M2_HOME%/bin to “path”
4. Run command “mvn --version” in dos
第一个maven命令
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app
该命令是执行archetype:create。其中前缀(prefix)“archetype”称之为maven plugin。而“create”称之为 maven goal。所以该命令就是执行archetype plugin中的create goal。
Maven goal类似于ant的task,而plugin就是多个goal的集合(collection of goals)。在maven web site repository里存放着各种各样的plugin,例如“jboss-maven-plugin”就是一个包含很多用来处理各种各样的操作的goal的集合。
当你执行的mvn命令第一次用到某个plugin时,就会自动download它到local repository。
上面的命令执行之后,生成的东东的结构为:
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
The POM
pom.xml是maven最核心的project's configuration file,就像是Ant的build.xml。上面的命令生成的project's 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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
第二个maven命令(cd my-app first)
mvn package
该命令要执行的操作就是把project打包成jar。
我们发现该命令和第一个要执行的命令(archetype:create)有所不同,第一个要执行的命令的格式是“plugin:goal”,而这第二个要执行的命令则只是一个单字。
Maven对单字命令不称为goal,而称为phase。
Phase是maven build lifecycle的其中一个step,build lifecycle是由多个有执行顺序的phases (ordered sequence of phases) 组成的。
当你执行一个phase命令时,maven就会执行顺序排在该phase之前的所有phases,然后再执行该phase。例如,如果我们执行“compile” phase,那么maven实际要执行的phases依次为:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
在执行了第二个命令之后,我们通过运行java来测试:
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
你就会看到输出结果为:
Hello World!
Maven Phases
在default lifecycle里,包含下列最常用被执行的phases:
- validate : validate the project is correct and all necessary information is available
- compile : compile all java files in project
- test : 使用unit test framework来test the compiled source code。这些test class不会被packaged and deployed。
- package : 把compiled code打包成你需要的格式,如JAR.
- integration-test : 把已经打包的东东(如jar)deploy到运行环境内,用于集成测试
- verify : run any checks to verify the package is valid and meets quality criteria
- install : install the package into the local repository, 这样做的目的是作为其他projects的一个local dependency
- deploy : 该phase会copy final package到remote repository for sharing。This phase is done in an integration or release environment。
另外还有3个很常用的、但不属于default lifecycle的phase:
- clean : cleans up artifacts created by prior builds
- site : generates site documentation for this project
- eclipse:eclipse : 创建相关的eclipse ide文件
每个LifeCycle phase实质上都会绑定到某个plugin:goal上!!例如命令
mvn compile
实际上等价于
mvn compiler:compile
即执行compile phase命令=执行compiler plugin的compile goal
但有一个很关键的知识点:pom.xml的<packaging>的值不同,会影响lifecycle phase与哪个plugin:goal的绑定。例如:
如果是
<packaging>jar</packaging>
那么
package phase绑定到jar:jar
则
mvn package = mvn jar:jar
如果是
<packaging>war</packaging>
那么
package phase绑定到war:war
则
mvn package = mvn war:war
注意:phases and goals可以按顺序一起执行。如:
mvn clean dependency:copy-dependencies package
该命令将clean project,然后copy dependencies, 最后执行package phase。
Generating the Site
mvn site
执行该phase会根据project的pom.xml来生成一个site。你可以在target/site目录下看到该命令生成的东东