http://maven.apache.org/guides/getting-started/index.html
什么是Maven?
Maven致力于为项目创建基础设施应用模式方法,从而通过提供最佳实践来促进理解力和生产力。Maven本质上是一个项目管理和理解的工具,有助于:
* 创建
* 文档
* 报告
* 依赖
* SCM
* 发布
* 分发
Maven如何有利于开发过程?
我如何创建第一个Maven项目?
我们使用Maven的archetype机理来创建第一个Maven项目。一个archetype定义为一个基础的模式或者模型,其他具有相同种类的所有事物能够共享。
运行:
mvn archetype:create /
-DarchetypeGroupId=org.apache.maven.archetypes /
-DgroupId=com.mycompany.app /
-DartifactId=my-app
一旦你运行了这条命令,将会创建一个my-app的目录,在这个目录下有一个pom.xml文件。这个pom.xml包含了项目对象模型(Project Object Model)。POM是在Maven下的基本工作单元。pom.xml的元素有:
project, modelVersion, groupId, artifactId, packaging, version, name, url, description. pom.xml的内容为:
<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>
完成后,目录的结构如下:
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
我如何编译我的应用源程序?
到pom.xml所在的目录下,运行:mvn compile.
我如何编译我的测试代码,并且运行我的单元测试?
mvn test
mvn test-compile (只是编译,不运行)
我如何创建JAR包,并且安装到我的本地repository?
mvn package
mvn install
我如何使用plug-ins?
我如何往JAR中增加资源
my-app
|-- pom.xml
`-- src
|-- main
| |-- java
| | `-- com
| | `-- mycompany
| | `-- app
| | `-- App.java
| `-- resources
| `-- META-INF
| `-- application.properties
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
我如何使用外部依赖?
pom.xml文件中的dependencies部分列出了为了生成我们项目所需要的外部依赖。对于每一个外部依赖,你需要定义至少4个内容:groupId, artifactId, version, 和scope。这4个内容和在pom.xml中定义的项目的内容是一致的。
<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将能够在生成项目的时候引用这个依赖。Maven是从什么地方引用依赖的呢?Maven将从你的本地repository(~/.m2/repository是缺省的位置)来查找所有的依赖。
那对于在其他地方生成的依赖呢?他们怎么进入到我本地的repository?只要一个项目应用了一个在本地repository中不存在的依赖,Maven将从远程repository中下载依赖到本地的repository中。缺省的,Maven所使用的远程repository是在http://repo1.maven.org/maven2/。你也可以搭建自己的远程repository(可能是你公司的一个中心repository)。
让我们为我们的项目增加另一个依赖。比如说我们为代码增加了一些日志功能,所以需要将增加log4j作为一个依赖。首先我们需要知道log4j的groupId, artifactId, 和version是什么。找到相关的log4j的目录,其中包含有一个名为maven-metadata.xml的文件,其内容如下:
<metadata>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.1.3</version>
<versioning>
<versions>
<version>1.1.3</version>
<version>1.2.4</version>
<version>1.2.5</version>
<version>1.2.6</version>
<version>1.2.7</version>
<version>1.2.8</version>
<version>1.2.11</version>
<version>1.2.9</version>
<version>1.2.12</version>
</versions>
</versioning>
</metadata>
从这个文件中,我们看到groupId就是"log4j", artifactId是"log4j".我们看到有很多不同的版本可以选择。目前我们只是使用最新版本,1.2.12。与maven-metadata.xml文件一道,我们可以看到对应于每个版本的log4j库的一个目录。在每个目录中,我们可以发现一个jar文件(如log4j-1.2.12.jar)以及一个pom文件(只是这个依赖的pom.xml文件,指示了它是否还需要其他的依赖),以及另一个maven-metadata.xml。现在我们可以在我们的pom.xml中加入log4j依赖了:
<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>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
我怎样创建其他类型的项目?
请注意生命周期是应用于任何项目类型的。例如,我们能创建一个简单的web应用。
mvn archetype:create /
-DarchetypeGroupId=org.apache.maven.archetypes /
-DarchetypeArtifactId=maven-archetype-webapp /
-DgroupId=com.mycompany.app /
-DartifactId=my-webapp
注意在pom.xml中的<packaging>元素是"war",这将告诉Maven去生成一个war. 运行mvn clean package,将最终生成my-webapp.war。
我如何一次生成多余一个项目?
首先我们需要增加一个父类pom.xml文件:
+- pom.xml
+- my-app
| +- pom.xml
| +- src
| +- main
| +- java
+- my-webapp
| +- pom.xml
| +- src
| +- main
| +- webapp
这个pom.xml的内容为:
<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>
<version>1.0-SNAPSHOT</version>
<artifactId>app</artifactId>
<packaging>pom</packaging>
<modules>
<module>my-app</module>
<module>my-webapp</module>
</modules>
</project>
因为在webapp中要用到my-app.jar,所以需要在my-webapp/pom.xml中加入依赖 : ...
<dependencies>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>
最后在每个子pom.xml中加入<parent>元素
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
最终运行:mvn clean install
.
这是如何工作的呢?首先父POM创建了,其中包含定义的模块列表。这告诉Maven对于一些项目的集合进行操作,而不是针对某一个项目。接下来,我们告诉WAR它需要my-app JAR。这使得JAR总是在WAR之前生成的,并且意味着WAR在他的库目录中要包含JAR。