Java项目构建-Maven

2017-12-28  本文已影响0人  ningping

例子: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 文件时,会先在本地找,然后去远程库找。

复杂的例子:多模块web项目

References

Apache Maven

Apache Maven 入门篇 ( 上 )

Apache Maven 入门篇(下)

Maven Archetype的设计和使用

Apache Ant 教程

上一篇 下一篇

猜你喜欢

热点阅读