Maven 使用介绍

1,创建Project

先去官方网站下载一个最新版本http://maven.apache.org/download.cgi. 下载后解压,使用之前最好先将maven的bin目录设置到path环境变量里面。

maven无非也就是用来build一个project的,直接先上一个例子,在命令行下输入下面的命令:

mvn archetype:generate DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=myapp

mvn就是maven的命令行程序,archetype:generate中的archetype是plugin的名字,generate是goal的名字,命令行后面的是一些参数。关于archetype和goal以及后面的参数,后面再细说。

如果是第一次运行,这个过程会有点慢,maven需要下载一些依赖项,中间如果有输入提示信息,直接回车使用默认值就可以了。这条命令执行完后,会在你的当前目录下生成一个名为myapp的目录:

注意这个目录结构,src/main/java 和 src/test/java 是不能改动,不然maven会无法找到源文件。下面是maven一个标准的目录结构:

src/main/java Application/Library sources
src/main/resources Application/Library resources
src/main/filters Resource filter files
src/main/assembly Assembly descriptors
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/site Site

另外maven还生成了一个重要的文件pom.xml,maven就是通过这个文件来来管理整个project,可以理解位类似于eclipse的.project文件。默认生成的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.chongshi.test</groupId>
  <artifactId>hello</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

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

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

解释一下这个xml文件的内容:

modelVersion: 这个XML文件所使用的POM格式的版本
groupId: 相当于这个project的所有者或者机构的一个标识,一般是com.company.xxx这种格式
artifactId: 这个project最后所生成的文档(jar、war)的名字,比如对于junit这个开源的project,它的artifactId就是junit
packaging: 这个project的打包的类型,一般是war、jar等值
version: project的版本
name: project的名字,生成文档等内容的时候会用的这个名字
这个project创建好后和普通的project没有什么不同,我们直接往里面放源代码进行开发就可以了,如果有目录想修改的也完全可以。

2,POM & archetype

archetype就是一个project的模板,上面我们生成的project就是用默认的archetype生成的。如果使用不同的archetype,生成的project结构会有所不同。 一个archetype指明了

1) 项目的目录结构以及什么目录是放source code,哪些是放test source code,哪些目录是放resource的。
2) 一个默认的pom.xml文件,这个默认的pom.xml文件中的groupId,artifactId,version用占位符表示,在创建project的时候通过参数传进来。
pom.xml文件的POM全称是Project Object Model,这个文件对于maven的使用者来说是一个和maven交互的渠道,pom.xml包含了一个maven project的配置,一个project该如何编译打包,project有哪些依赖项等等。

仔细看一下我们前面创建project的命令:mvn archetype:generate DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=myapp

1) archetype:generate, 这是一个maven的plugin,用来从一个archetype创建一个project,关于plugin后面再说。
2) DarchetypeGroupId,这个就是指的archetype的groupid,也就是说是用的哪个archetype,或者说用哪个项目模板。
3) 后面的两个参数,用来放大pom.xml文件里面,作为当前创建的project的描述信息。
Project创建好了,看如何去编译,直接进入的project的目录,在命令行下:

mvn compile

编译完后maven会创建一个target目录去保存编译结果。 我们需要编译成一个什么样的内容,以及要输出到什么地方等等,都是可以在pom.xml文件里面配置的,但是因为我们目前并没有指定这些内容,所以maven会使用默认值。

我们还可以用maven执行test:

mvn test

第一次执行时,maven会去下载一些依赖项。另外要注意的时,如果我们更改了默认的目录结构,maven会因为找bu到test而无法去执行test。如果只需要编译test可以执行:

mvn test-compile

要把项目打包,执行:

mvn package

mvn会根据pom.xml里面的packaging选项打包成相应的文件。

3,repository & dependency

maven里面有一个repository的概念,当我们的项目依赖于某个jar时,maven会去repository里面去找。repository分两种,一种是远程的,一种是本地的。如果有几个project都用到junit,我们可以把junit放在repository里面,几个project可以公用,节约存储空间而且方便管理,这个repository的位置可以在pom.xml里面设置。

本地的默认的路径是安装用户的目录下的 .m2\repository 文件夹。如果一个依赖项在本地的repository里面没有,那么maven会去他自己的远程的repository http://repo.maven.apache.org/maven2 去下载后放到本地的repository里面。

也就是说,我们如果我们的project需要要引用一个依赖项,我们只需要在pom.xml文件中进行配置,maven会自动帮我们去引用。 我们之前的创建project里面需要写单元测试,引用到了junit,看pom中的配置:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

每一个需要为每一个 dependency 指明groupId,artifactId,version。scope很简单,意思是说我们需要怎么引用,比如我们上面的例子里面设置的是test,意思是说只在test里面引用junit。 但是我们如何知道groupId,artifactId和version呢? 比如我现在想引用log4j,这个几个值怎么填? 可以去http://mirrors.ibiblio.org/maven2/ 上去查找。比如log4j,我们就在上面这个地址加上log4j,也就是http://mirrors.ibiblio.org/maven2/junit/。进去后会有一个maven-metadata.xml,打开就可以知道这些值了然后添加这个dependency了。
如果要把一个project安装到本地的repository里面,可以执行下面的命令:

mvn install

到这里就说完了创建,编译,测试,打包以及安装,大部分的项目也就是做这些事情。

再介绍几个其它命令:

mvn site : 为你的project创建一个站点
mvn clean: 清除target目录下的所有文件
mvn eclipse:eclipse :为project生成eclipse的工程文件和classpath文件

4,build lifecycle & build phase & goal

maven有一套build的生命周期,是按照一套顺序走下来的,这一套顺序就叫一个生命周期(lifecycle)。maven内置三种生命周期:default, clean 和 site。一个生命周期分为多个build phase,下面是default生命周期全部的build phase:

validate:validate the project is correct and all necessary information is available.
initialize:initialize build state, e.g. set properties or create directories.
generate-sources:generate any source code for inclusion in compilation.
process-sources:process the source code, for example to filter any values.
generate-resources:generate resources for inclusion in the package.
process-resources:copy and process the resources into the destination directory, ready for packaging.
compile:compile the source code of the project.
process-classes:post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
generate-test-sources:generate any test source code for inclusion in compilation.
process-test-sources:process the test source code, for example to filter any values.
generate-test-resources:create resources for testing.
process-test-resources:copy and process the resources into the test destination directory.
test-compile:compile the test source code into the test destination directory
process-test-classes:post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes. For Maven 2.0.5 and above.
test:run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed.
prepare-package:perform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package. (Maven 2.1 and above)
package:take the compiled code and package it in its distributable format, such as a JAR.
pre-integration-test:perform actions required before integration tests are executed. This may involve things such as setting up the required environment.
integration-test:process and deploy the package if necessary into an environment where integration tests can be run.
post-integration-test:perform actions required after integration tests have been executed. This may including cleaning up the environment.
verify:run any checks to verify the package is valid and meets quality criteria.
install:install the package into the local repository, for use as a dependency in other projects locally.
deploy:done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
这些build phase是按照顺序执行的,如果执行后面的build phase,前面的build phase 也会被执行。例如如果执行:

mvn deploy

前面的install、verify一直到validate这些build phase都会执行。

每一个build phase是由goal组成的,一个goal其实就是一个任务,一个goal可以关联到一个build phase也可以不关联到任何build phase 。 不关联到任何phase的goal是可以独立执行的,例如:

mvn clean dependency:copy-dependencies package

上面的命令会导致先执行clean这个phase,然后拷贝依赖项,最后打包。注意,这里clean这个goal是clean这个lifecycle里面的一个goal,所以可以看到不同lifecycle的build phase和goal是可以混合在一起执行的。

如果一个goal被绑定到多个phase上,那么goal就会被执行多次。

phase的顺序是已经固定的,如果一个phase没有绑定到任何goal,那么phase就不会被执行。 一个goal可以通过两种方式绑定到一个phase,一个是指定packaging,另一个就是plugin。 ,

4,packaging&plugin

plugin就是用来向maven提供goal的。一个plugin里面可以有多个goal,这就是为什么我们在指明goal时,前面会用一个冒号与plugin的名字。

一个plugin自己可以指定自己的goal绑定到哪个lifecycle的哪一个Phase上,另外也可以配置一个goal绑定到哪个phase上。可以在pom.xml里面配置。 看两个配置:

<plugin>
   <groupId>org.codehaus.modello</groupId>
   <artifactId>modello-maven-plugin</artifactId>
   <version>1.4</version>
   <executions>
     <execution>
       <configuration>
         <models>
           <model>src/main/mdo/maven.mdo</model>
         </models>
         <version>4.0.0</version>
       </configuration>
       <goals>
         <goal>java</goal>
       </goals>
     </execution>
   </executions>
 </plugin>

这个就在当前的lifecycle里面添加了一个名字叫java的goal,这goal会根据自己的配置去绑定到一个phase,在phase执行的时候这个goal会执行。并且在这个配置里面,可以指定多个execution来让这个goal执行多次。

<plugin>
   <groupId>com.mycompany.example</groupId>
   <artifactId>display-maven-plugin</artifactId>
   <version>1.0</version>
   <executions>
     <execution>
       <phase>process-test-resources</phase>
       <goals>
         <goal>time</goal>
       </goals>
     </execution>
   </executions>
 </plugin>

这个名为time的goal把自己绑定到了process-test-resource这个phase上。
在默认情况下,并不是所有的phase都绑定了goal,比如clean这个lifecycle是有三个phase的,但是只有其中的一个名为clean的phase默认绑定了一个clean:clean goal,其它两个phase默认没有绑定任何goal。
之前已经提到过packaging,在pom.xml可以指定packaging,每种packaging都设定了一组phase和goal之间的绑定关系。在default lifecycle下,当packaging为 ejb/ejb3/jar/par/rar/war 其中之一的值的时候,只有以下的phase绑定了goal,具体如下:

process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar
install install:install
deploy deploy:deploy

6,总结

首先搞清楚maven的project的目录结构,然后理解maven的lifecycle,lifecycle是由build phase组成,每一个build phase会绑定到goal。goal是由plugin提供的。 每一种packaging的值都表明了一定的phase和goal之间的绑定关系。另外一个很重要的就是dependency,我们要在项目中引用一个依赖,只需要在pom.xml指定依赖的名字和版本,maven会自动去远程的repository下载,然后放到本地的repository里面,这样以后所有的project都可以共用其它细节可以参考http://maven.apache.org/guides/index.html。

更多资料

配置:http://www.cnblogs.com/quanyongan/archive/2013/04/17/3025971.html

解说:http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-1-406235-zhs.html

pom解析:http://www.ibm.com/developerworks/cn/java/j-lo-maven/

初级:http://jingyan.baidu.com/article/37bce2be153dc91003f3a257.html

编译:http://www.cnblogs.com/fnng/archive/2011/12/02/2272610.html

视频:http://www.icoolxue.com/album/show/45

时间: 2024-08-02 11:03:24

Maven 使用介绍的相关文章

学习笔记——Maven实战(七)常用Maven插件介绍(上)

我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven-compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码. 用户可以通过两种方式调用Maven插

Maven实战(七,八)——经常使用Maven插件介绍

我们都知道Maven本质上是一个插件框架,它的核心并不运行不论什么详细的构建任务,全部这些任务都交给插件来完毕,比如编译源代码是由maven-compiler-plugin完毕的.进一步说,每一个任务相应了一个插件目标(goal),每一个插件会有一个或者多个目标,比如maven-compiler-plugin的compile目标用来编译位于src/main/java/文件夹下的主源代码.testCompile目标用来编译位于src/test/java/文件夹下的測试源代码. 用户能够通过两种方式

Maven的介绍

一.Maven的介绍--------{一个Maven的配置文件,pom.xml:} Maven是现在Java社区中最强大的项目管理和项目构建工具. 对项目依赖的jar包进行管理,可以让你的项目保持基本的依赖,排除冗余jar包,并且可以让你非常轻松的对依赖的jar包进行版本升级.而这些仅仅是Maven最基本的功能,它可以在这基础上对项目进行清理.编译.测试.打包.发布等等构建项目的工作. 二.Maven下载安装 1.配置Java运行环境 Maven依赖Java运行环境,因此使用Maven之前需要配

Maven for Eclipse 第一章 ——Maven的介绍

最近深陷与一个无比垃圾的项目无法自拔,好久没有更新文章了.今天简单介绍一下 Maven 在 Eclipse 中的使用.文章的内容几乎出于<Maven for Eclipse>一书,此书言简意赅,实用性很强. 首先,Maven 是一个软件项目管理和程序理解的工具,一般来说,软件项目管理包括规划,组织,管理资源池,形成资源评估等.简单来说,Maven是一个全面的方法对应用模式的过程构建基础设施,它主要有如下目标: 简化程序的构建流程 提供统一的构建系统 提供质量项目信息 提供了项目最佳实战的指导

常用Maven插件介绍

我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有 这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven- compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码. 用户可以通过两种方式调用Mav

17.Maven 项目介绍

学习前提 相对于传统的项目,Maven 下管理和构建的项目真的非常好用和简单,所以这里也强调下,尽量使用此类工具进行项目构建. 学习本讲还有一个前提:你必须会 Maven 相关知识点,Maven 相关知识点是不在本专题的讲解范围里面的,所以请自己私下进行学习.如果愿意你也可以看我过去整理的一份材料:http://www.youmeek.com/intellij-idea-part-xviii-maven/ Maven 常用设置介绍 如上图标注 1 所示,我们可以指定我们本地 Maven 的安装目

maven 主要介绍以及 javaee 中构建一词的概念

1.maven 的主要介绍: maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 java 平台的项目构建和依赖管理. 其功能主要为了应付在实际开发的过程中遇到的下列的问题: a.如果项目非常庞大,就不适合继续使用package来划分模块.最好是每一个模块对应一个工程,利于分工协作.借助于 maven 就可以将一个项目拆分成多个工程. b.项目中需要的 jar 包必须手动"复制"."粘贴"到 WEB-INF/lib 目录下,这带来的问题

Maven入门介绍

一.Maven的基本概念 1.1为什么需要Maven(作用) Ⅰ. 大家都知道使用Maven,那么我们为什么要要使用maven大家思考过吗?其实我也只是对maven入门阶段,刚刚接触的时候只是知道使用它可以减少我们不必要的一直添加jar包依赖.在以前我们开发项目都需要每次下载相关的依赖jar包,但是有了maven以后,你只需要添加很少的代码就可以添加你需要的依赖.所以第一点就是依赖管理(Dependencies). Ⅱ. 其次,Maven还有一点就是构建项目(Builds),你可以使用构建项目的

Maven 教程(3)— Maven仓库介绍与本地仓库配置

原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79537837 1.Maven本地仓库/远程仓库的基本介绍 本地仓库是指存在于我们本机的仓库,在我们加入依赖时候,首先会跑到我们的本地仓库去找,如果找不到则会跑到远程仓库中去找.对于依赖的包大家可以从这个地址进行搜索:http://mvnrepository.com/. 远程仓库是指其他服务器上的仓库,包括全球中央仓库,公司内部的私服,又或者其他公司提供的公共库.后面会专门聊聊私