例子:HelloWorld
创建
用mvn插件archetype创建helloworld项目:
egao$ mvn archetype:generate -DgroupId=com.ellie.helloworld -DartifactId=helloworld -Dpackage=com.ellie.helloworld -Dversion=1.0-SNAPSHOT
项目的默认目录结构如下(除非特别定制,maven项目都遵循这种惯例):
egao$ cd helloworld
egao$ ll
total 0
-rw-r--r-- 1 egao staff 762 Dec 28 10:24 pom.xml
drwxr-xr-x 4 egao staff 136 Dec 28 10:24 src
编译打包
"mvn package",将执行mvn默认生命周期中从开始到package 阶段(包括default-resources,default-compile,default-testResources,default-testCompile,default-test,default-jar)的所有任务。
egao$ mvn package
[INFO] Scanning for projects...
...
[INFO] Building helloworld 1.0-SNAPSHOT
...
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helloworld ---
...
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ helloworld ---
...
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ helloworld ---
...
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ helloworld ---
...
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ helloworld ---
...
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ helloworld ---
...
[INFO] BUILD SUCCESS
...
构建后会生成target目录,class文件和jar文件位于该目录:
egao$ ll
total 8
-rw-r--r-- 1 egao staff 762 Dec 28 10:24 pom.xml
drwxr-xr-x 4 egao staff 136 Dec 28 10:24 src
drwxr-xr-x 8 egao staff 272 Dec 28 14:08 target
egao$ java -cp target/helloworld-1.0-SNAPSHOT.jar com.ellie.helloworld.App
Hello World!
Maven概念解析
POM
项目坐标:groupId+artifactId+version+packaging
子项目会继承父项目的pom。所有pom都继承自一个super pom。
通过mvn help:effective-pom可以查看构建时真正使用的pom。
插件和生命周期
maven控制构建过程(生命周期),构建过程的每个具体步骤是交给插件执行的。
以HelloWorld为例,它使用默认的生命周期。
process-resources 阶段:resources:resources
compile 阶段:compiler:compile
process-classes 阶段:(默认无目标)
process-test-resources 阶段:resources:testResources
test-compile 阶段:compiler:testCompile
test 阶段:surefire:test
prepare-package 阶段:(默认无目标)
package 阶段:jar:jar
在HelloWorld的构建过程中,maven-compiler-plugin这个插件使用了两次:编译业务代码(compile阶段,compiler:compile),编译测试代码(test-compile阶段,compiler:testCompile)。
依赖管理
依赖传递:项目依赖A.jar, A.jar又依赖B.jar,项目只需定义对A的依赖。maven会根据A的pom文件自动下载B
依赖的scope:决定了依赖关系的适用范围。默认是compile,任何时候都会被包含在 classpath 中,包括打包。test scope只有在test阶段才会起作用。provided scope在打包时不起作用,它表示运行环境会提供这个依赖的jar
库
public的maven项目可以从默认的maven库下载:http://repo.maven.org/maven2
maven下载的jar在本地默认存放在~/.m2/repository中。
maven 查找需要的 jar 文件时,会先在本地找,然后去远程库找。