Maven Getting Started Guide

来源:互联网 发布:steam mac 游戏 编辑:程序博客网 时间:2024/04/30 02:13

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。