marven简介与使用

introduction

Maven是一个采用纯Java编写的开 源项目管理工具。Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中,通过该文件,Maven可以管理项目的整个声明周期,包括编 译,构建,测试,发布,报告等等。目前Apache下绝大多数项目都已经采用Maven进行管理。而Maven本身还支持多种插件,可以方便更灵活的控制 项目。 

下载:Maven – Download Apache Maven

使用说明:Maven – Users Centre

创建项目

首先切换到你想要创建项目的目录输入如下命令


mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app 

-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Archetype 可以理解成项目的模型。 Maven 为我们提供了很多种的项目模型,包括从简单的 Swing 到复杂的 Web 应用。

archetype:generate 是什么意思呢?archetype 是一个插件的名字,generate是目标(goal)的名字。这个命令的意思是告诉 maven 执行archetype 插件的 generate 目标。插件目标通常会写成 pluginId:goalId

一个目标是一个工作单元,而插件则是一个或者多个目标的集合。比如说Jar插件,Compiler插件,Surefire插件等。从看名字就能知道,Jar 插件包含建立Jar文件的目标, Compiler 插件包含编译源代码和单元测试代码的目标。Surefire 插件的话,则是运行单元测试。mvn 本身不会做太多的事情,它不知道怎么样编译或者怎么样打包。它把构建的任务交给插件去做。插件定义了常用的构建逻辑,能够被重复利用。

注意:第一次创建应用消耗的时间比较长。 This is because Maven is downloading the most recent artifacts (plugin jars and other files) into your local repository.

它会从网上的 maven 库 (repository) 下载需要的程序,存放在你电脑的本地库 (local repository) 中,所以这个时候你需要有 Internet 连接。Maven 默认的本地库是 ~/.m2/repository/ ,在 Windows 下是 %USER_HOME%\.m2\repository\ 。

创建项目的目录结构

  1. my-app

  2. |-- pom.xml

  3. `-- src

  4.     |-- main

  5.     |   `-- java

  6.     |       `-- com

  7.     |           `-- mycompany

  8.     |               `-- app

  9.     |                   `-- App.java

  10.     `-- test

  11.         `-- java

  12.             `-- com

  13.                 `-- mycompany

  14.                     `-- app

  15.                         `-- AppTest.java

The src/main/java directory contains the project source code, the src/test/java directory contains the test source, and the pom.xml file is the project's Project Object Model, or POM.

marven自动生成的目录结构

src/main/java Application/Library sources

src/main/resources Application/Library resources

src/main/filters   Resource filter files

src/main/config Configuration files

src/main/scripts Application/Library scripts

src/main/webapp Web application sources

src/test/java Test sources

src/test/resources Test resources

src/test/filters Test resource filter files

src/it Integration Tests (primarily for plugins)

src/assembly Assembly descriptors

src/site Site

LICENSE.txt Project's license

NOTICE.txt Notices and attributions required by libraries that the project depends on

README.txt Project's readme

pom.xml

pom.xml 文件是maven对一个项目的核心配置,这个文件将包含你希望如何构建项目的大多数配置信息。

<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, artifactId, packaging, version 叫作 maven 坐标,它能唯一的确定一个项目 -->

  <groupId>com.mycompany.app</groupId>

  <artifactId>my-app</artifactId>

  <version>1.0-SNAPSHOT</version>

  <packaging>jar</packaging>


  <name>Maven Quick Start Archetype</name>

  <url>http://maven.apache.org</url>


  <!-- 定义依赖关系 -->

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.8.2</version>

      <!-- scope 决定了依赖关系的适用范围,只会在执行 compiler:testCompile and surefire:test 目标的时候才会被加到 classpath 中,在执行 compiler:compile 目标时是拿不到 junit 的 -->

      <scope>test</scope>

    </dependency>

  </dependencies>

</project>

定义项目的类型、名字,管理依赖关系,定制插件的行为

一般 maven 坐标写成如下的格式:

    groupId:artifactId:packaging:version

像我们的例子就会写成:

    com.mycompany.helloworld: helloworld: jar: 1.0-SNAPSHOT

大项目一般会分成几个子项目。在这种情况下,每个子项目就会有自己的 POM 文件,然后它们会有一个共同的父项目。这样只要构建父项目就能够构建所有的子项目了。子项目的 POM 会继承父项目的 POM。另外,所有的 POM都继承了一个 Super-POM。Super-POM 设置了一些默认值。

依赖关系

被依赖的 jar 文件会有自己的依赖关系。那么我们是不是需要把那些间接依赖的 jar 文件也都定义在POM中呢?答案是不需要,因为 maven 提供了传递依赖的特性。所谓传递依赖是指 maven 会检查被依赖的 jar 文件,把它的依赖关系纳入最终解决的依赖关系链中。

针对上面的 junit 依赖关系,如果你看一下 maven 的本地库,你会发现 maven 不但下载了 junit-3.8.1.jar,还下载了它的 POM 文件。这样 maven 就能检查 junit 的依赖关系,把它所需要的依赖也包括进来。

在 POM 的 dependencies 部分中,scope 决定了依赖关系的适用范围。我们的例子中 junit 的 scope 是 test,那么它只会在执行 compiler:testCompile and surefire:test 目标的时候才会被加到 classpath 中,在执行 compiler:compile 目标时是拿不到 junit 的。

我们还可以指定 scope 为 provided,意思是 JDK 或者容器会提供所需的jar文件。比如说在做web应用开发的时候,我们在编译的时候需要 servlet API jar 文件,但是在打包的时候不需要把这个 jar 文件打在 WAR 中,因为servlet容器或者应用服务器会提供的。scope 的默认值是 compile,即任何时候都会被包含在 classpath 中,在打包的时候也会被包括进去。

marven生命周期

validate:验证工程是否正确,所有需要的资源是否可用。 

compile:编译项目的源代码。   

test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。 

Package:把已编译的代码打包成可发布的格式,比如jar。 

integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。 

verify:运行所有检查,验证包是否有效且达到质量标准。 

install:把包安装在本地的repository中,可以被其他工程作为依赖来使用。 

Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。 

clean:清除先前构建的artifacts(在maven中,把由项目生成的包都叫作artifact)。 

site:为项目生成文档站点。 

当给出一个phase,Maven将执行所有的在此阶段前的phase及其自身

marven库

当第一次运行 maven 命令的时候,你需要 Internet 连接,因为它要从网上下载一些文件。那么它从哪里下载呢?它是从 maven 默认的远程库(http://repo1.maven.org/maven2) 下载的。这个远程库有 maven 的核心插件和可供下载的 jar 文件。

但是不是所有的 jar 文件都是可以从默认的远程库下载的,比如说我们自己开发的项目。这个时候,有两个选择:要么在公司内部设置定制库,要么手动下载和安装所需的jar文件到本地库。

本地库是指 maven 下载了插件或者 jar 文件后存放在本地机器上的拷贝。在 Linux 上,它的位置在 ~/.m2/repository,在 Windows XP 上,在 C:\Documents and Settings\username\.m2\repository ,在 Windows 7 上,在 C:\Users\username\.m2\repository。当 maven 查找需要的 jar 文件时,它会先在本地库中寻找,只有在找不到的情况下,才会去远程库中找。

运行下面的命令能把我们的 helloworld 项目安装到本地库:

     $mvn install

一旦一个项目被安装到了本地库后,你别的项目就可以通过 maven 坐标和这个项目建立依赖关系。比如如果我现在有一个新项目需要用到 helloworld,那么在运行了上面的 mvn install 命令后,我就可以如下所示来建立依赖关系:

Xml 代码

    <dependency>

      <groupId>com.mycompany.helloworld</groupId>

      <artifactId>helloworld</artifactId>

      <version>1.0-SNAPSHOT</version>

    </dependency> 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值