文档章节

Maven使用介绍

MiniBu
 MiniBu
发布于 2016/05/13 14:22
字数 2982
阅读 91
收藏 6
点赞 2
评论 0

Maven 使用介绍

创建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的目录:

image

注意这个目录结构,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.mycompany.app</groupId>

    <artifactId>my-app</artifactId>

    <version>1.1.0.1</version>

    <packaging>jar</packaging>

    <name>myapp</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没有什么不同,我们直接往里面放源代码进行开发就可以了,如果有目录想修改的也完全可以。

 

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. 1) archetype:generate, 这是一个maven的plugin,用来从一个archetype创建一个project,关于plugin后面再说。
  2. 2) DarchetypeGroupId,这个就是指的archetype的groupid,也就是说是用的哪个archetype,或者说用哪个项目模板。
  3. 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选项打包成相应的文件。

 

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

 

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

再介绍几个其它命令:

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

 

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。

 

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

 

总结

首先搞清楚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/JeffreySun/archive/2013/03/14/2960573.html

共有 人打赏支持
MiniBu
粉丝 45
博文 106
码字总数 30099
作品 0
上海
项目经理
【Maven】项目管理利器Maven——前言小序

一、前言 可以说,现在很多的项目管理工具都使用了Maven,学习一下Maven,了解一些Maven相关的命令还是很有必要的。在下面的几篇博客中,小编从下面几个方面向大家介绍Maven: 二、目录结构 ...

kisscatforever
01/15
0
0
Maven 集成Tomcat插件

Maven已经是Java的项目管理标配,如何在JavaEE开发使用Maven调用Web应用,是很多同学关心的问题。本文将介绍,Maven如何介绍Tomcat插件。 Maven Tomcat插件现在主要有两个版本,tomcat-mave...

happy圈圈
2014/05/12
0
0
Maven 集成Tomcat7插件

Maven已经是Java的项目管理标配,如何在JavaEE开发使用Maven调用Web应用,是很多同学关心的问题。本文将介绍,Maven如何介绍Tomcat插件。 Maven Tomcat插件现在主要有两个版本,tomcat-mave...

squanchao
2015/10/17
372
0
Maven 集成Tomcat插件

Maven已经是Java的项目管理标配,如何在JavaEE开发使用Maven调用Web应用,是很多同学关心的问题。本文将介绍,Maven如何介绍Tomcat插件。 Maven Tomcat插件现在主要有两个版本,tomcat-mave...

小李飞刀008
2013/10/14
0
10
【项目管理与构建】Nexus的详细介绍以及安装

前面几篇博文,我们介绍了怎么使用maven,这篇博文我们简单的介绍maven的私服Nexus。 简介 Nexus是Maven仓库管理器,也可以叫Maven的私服。Nexus是一个强大的Maven仓库管理器,它极大地简化了...

architect刘源源
02/09
0
0
Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置(很不错)

由浅入深,主要介绍maven的用途、核心概念(Pom、Repositories、Artifact、Build Lifecycle、Goal)、用法(Archetype意义及创建各种项目)、maven常用参数和命令以及简单故障排除、maven扩展(...

浮躁的码农
2015/09/28
41
0
maven配置开源中国镜像

介绍 亲爱的小伙伴们,开源中国的 Maven 库上线咯!为了方便广大开发同学,开源中国特别推出国内的 Maven 中央库,提供高速稳定的网络和服务,为国内 Maven 使用者提供便捷服务。本 Maven 库...

雨巷1
2016/04/04
666
4
Maven Cookbook (PDF分享)

该图书用简单易懂的方式介绍如何使用 Maven 开发 OSGi 组件等一些常见应用开发。 Maven Cookbook 内容包括: 使用 Maven 开发基于 OSGi 应用 在 Maven 中集成 Groovy Scala 和 Maven Ant 和 ...

红薯
2011/11/08
2.6K
12
Java开发小技巧(二):自定义Maven依赖

前言 我们在项目开发中经常会将一些通用的类、方法等内容进行打包,打造成我们自己的开发工具包,作为各个项目的依赖来使用。 一般的做法是将项目导出成Jar包,然后在其它项目中将其导入,看...

kMacro
2017/12/21
0
0
Maven的使用,Nexus建立本地仓库以及Eclipse导入Maven项目(四): 实战篇

Maven的使用,Nexus建立本地仓库以及Eclipse导入Maven项目(四): 实战篇 项目实战篇: ================================================================ 下载项目 ------------------------......

DavyZhong
2012/11/12
0
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway 接口文档聚合实现

在微服务架构下,通常每个微服务都会使用Swagger来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,毕竟懒是程序员的美德。 由于swagger2暂时不支持webflux 走...

冷冷gg
35分钟前
13
0
流利阅读笔记30-20180719待学习

1.今日导读 2.带着问题听讲解 3.新闻正文(中英文对照) 4.重点词汇 5.拓展内容

aibinxiao
38分钟前
1
0
OSChina 周五乱弹 —— 我们是食物链的最底层

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @温家成 :分享谢安琪的单曲《姿色份子》 《姿色份子》- 谢安琪 手机党少年们想听歌,请使劲儿戳(这里) @贪吃飒:最近p2p怎么了、半个月爆了...

小小编辑
51分钟前
6
1
Android Studio 3.0 之后打包apk出现应用未安装问题

1、废话 出现这个问题的原因,并不是只有一个,而是有多个原因,不懂的估计会被搞得一头雾水,下面我列举的是我遇到的几种问题和网友遇到的几种问题,但不一定是全部,也有可能有些莫名其妙的...

她叫我小渝
今天
0
0
前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
9
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部