Maven

一、Maven概念

1.maven是什么:Maven 是一个项目管理工具。它负责管理项目开发过程中的几乎所有的东西。

版本构建输出物管理依赖关系文档和构建结果项目关系移植性管理

2.Maven的生命周期:maven把项目的构建划分为不同的生命周期(lifecycle)。粗略一点的话,它这个过程(phase)包括:编译、测试、打包、集成测试、验证、部署。maven中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些goal进行各种处理。

3.Maven的标准工程结构

MavenProjectRoot(项目根目录)
   |----src
   |     |----main
   |     |  
      |----java ——存放项目的.java文件
   |     |  
      |----resources ——存放项目资源文件,如spring,
hibernate配置文件
   |     |----test
   |     |  
      |----java ——存放所有测试.java文件,如JUnit测试类
   |     |        
|----resources ——存放项目资源文件,如spring,
hibernate配置文件
   |----target ——项目输出位置
   |----pom.xml ----用于标识该项目是一个Maven项目

4.Maven的版本规范:

maven使用如下几个要素来唯一定位某一个输出物:

groudId

团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。一般对应着JAVA的包的结构。例如org.apache

artifactId 

单独项目的唯一标识符。比如我们的tomcat, commons等。不要在artifactId中包含点号(.)。

version 

一个项目的特定版本。

packaging 

项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。

5.maven仓库与本地仓储配置:

根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:groupId/artifactId/version/artifactId-version.packaging。

分类:本地仓库(每个用户只有一个本地仓库,默认是在~/.m2/repository/,~代表的是用户目录),

远程仓库(中央仓库:http://search.maven.org/、私服)

从Maven中心仓库下载到本地的jar包的默认存放在”${user.home}/.m2/repository”中,${user.home}表示当前登录系统的用户目录(如"C:\Users\gacl")

自定义jar包存放位置(本地仓库):E盘创建文件加”repository”,修改apache-maven-2.2.3\conf目录下的settings.xml文件,添加

<localRepository>E:/repository</localRepository>

6.使用Maven编译 —— 清理 —— 测试 —— 打包 —— 安装

使用Maven编译项目,编译项目的命令是:"mvn compile"

使用Maven清理项目,清理项目的命令是:"mvn clean"

使用Maven测试项目,测试项目的命令是:"mvn test"

使用Maven打包项目,打包项目的命令是:"mvn package"

使用Maven部署项目,部署项目的命令是:"mvn install"

8.依赖管理:

依赖范围:依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
1.compile 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2.test:测试依赖范围。只对于测试classpath有效
2.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
3.runtime:运行时提供。例如:jdbc驱动

依赖传递:MakeFriends.jar直接依赖于HelloFriends.jar,而HelloFriends.jar又直接依赖于Hello.jar,那么MakeFriends.jar也依赖于Hello.jar,这就是传递性依赖,只不过这种依赖是间接依赖,如下图所示:

9.聚合继承

聚合主要为了快速构建项目,继承主要为了消除重复。如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合。

聚合配置代码:

<modules>
<module>模块一</module>
<module>模块二</module>
<module>模块三</module>
</modules>

继承配置代码:

 <parent>
<groupId>me.gacl.maven</groupId>
<artifactId>ParentProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../ParentProject/pom.xml</relativePath>
</parent>

其中父模块用dependencyManagement管理依赖。

PS:dependencyManagement是表示依赖jar包的声明,即你在项目中的dependencyManagement下声明了依赖,maven不会加载该依赖,dependencyManagement声明可以被继承。

dependencyManagement的一个使用案例是当有父子项目的时候,父项目中可以利用dependencyManagement声明子项目中需要用到的依赖jar包,之后,当某个或者某几个子项目需要加载该插件的时候,就可以在子项目中dependencies节点只配置 groupId 和 artifactId就可以完成插件的引用。

dependencyManagement主要是为了统一管理插件,确保所有子项目使用的插件版本保持一致,类似的还是plugins和pluginManagement。

二、使用maven创建项目

2.1 maven创建Java项目

2.1.1 创建

1、使用mvn archetype:generate命令,如下所示:

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

2、使用mvn archetype:create命令,如下所示:

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

2.1.2 pom文件

1)pom意思就是project object model。

2)pom.xml包含了项目构建的信息,包括项目的信息、项目的依赖等。

3)pom.xml文件是可以继承的,大型项目中,子模块的pom.xml一般都会继承于父模块的pom.xml

2.1.3使用maven编译-清理-测试-打包-安装项目

切换到项目目录,执行mvn clean compile / mvn clean test / mvn clean package / mvn clean install 命令分别执行。

构建成功,就会将项目的jar包安装到本地仓库。

运行jar包:进入命令行,切换到myapp目录,执行命令:

java -cp target\myapp-1.0-SNAPSHOT.jar com.mycompany.app.App

运行项目APP的jar包

2.2 maven创建JavaWeb项目

2.2.1 构建

1、使用mvn archetype:generate命令,如下所示:

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-WebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

2、使用mvn archetype:create命令,如下所示:

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=myWebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

2.3 创建多模块项目

在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层)、dao(数据库访问层)、service(业务逻辑层)、web(表现层),这样分层之后,各个层之间的职责会比较明确,后期维护起来也相对比较容易,今天我们就是使用Maven来构建以上的各个层。

  项目结构如下:

system-parent
        |----pom.xml
        |----system-domain
                |----pom.xml
        |----system-dao
                |----pom.xml
        |----system-service
                |----pom.xml
        |----system-web
                |----pom.xml

(1)创建system-parent项目

创建system-parent,用来给各个子模块继承。

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

将src文件夹删除,然后修改pom.xml文件,将<packaging>jar</packaging>修改为<packaging>pom</packaging>,pom表示它是一个被继承的模块,修改后的内容如下:

(2)创建sytem-domain模块

在命令行进入创建好的system-parent目录,然后执行下列命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-domain -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

同时,在system-parent目录中的pom.xml文件自动添加了如下内容:

<modules>
<module>system-domain</module>
</modules>

sytem-domainpom文件为:

修改system-domain目录中的pom.xml文件,把<groupId>me.gacl</groupId><version>1.0-SNAPSHOT</version>去掉,加上<packaging>jar</packaging>,因为groupId和version会继承system-parent中的groupId和version,packaging设置打包方式为jar

修改后:

(3)创建system-dao(类似domain)

在命令行进入创建好的system-parent目录,然后执行下列命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-dao -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

(4)创建system-service(类似domain)

在命令行进入创建好的system-parent目录,然后执行下列命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

(5)创建system-web

在命令行进入创建好的system-parent目录,然后执行下列命令:

mvn archetype:create -DgroupId=me.gacl -DartifactId=system-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

注意,web项目的打包方式是war

最后,system-parent的pom文件为:

2.3 项目构建命令说明

mvn archetype:create或者mvn archetype:generate  固定写法

  -DgroupId                 组织标识(包名)

  -DartifactId                项目名称

  -DarchetypeArtifactId                指定ArchetypeId,maven-archetype-quickstart,创建一个Java Project;maven-archetype-webapp,创建一个Web Project

  -DinteractiveMode             是否使用交互模式

  archetype是mvn内置的一个插件,create任务可以创建一个java项目骨架,DgroupId是软件包的名称,DartifactId是项目名,DarchetypeArtifactId是可用的mvn项目骨架,目前可以使用的骨架有:

  • maven-archetype-archetype
  • maven-archetype-j2ee-simple
  • maven-archetype-mojo
  • maven-archetype-portlet
  • maven-archetype-profiles (currently under development)
  • maven-archetype-quickstart
  • maven-archetype-simple (currently under development)
  • maven-archetype-site
  • maven-archetype-site-simple
  • maven-archetype-webapp

每一个骨架都会建相应的目录结构和一些通用文件,最常用的是maven-archetype-quickstartmaven-archetype-webapp骨架。maven-archetype-quickstart骨架是用来创建一个Java Project,而maven-archetype-webapp骨架则是用来创建一个JavaWeb Project。

2.4 maven常用命令

生命周期

阶段描述

mvn validate

验证项目是否正确,以及所有为了完整构建必要的信息是否可用

mvn generate-sources

生成所有需要包含在编译过程中的源代码

mvn process-sources

处理源代码,比如过滤一些值

mvn generate-resources

生成所有需要包含在打包过程中的资源文件

mvn process-resources

复制并处理资源文件至目标目录,准备打包

mvn compile

编译项目的源代码

mvn process-classes

后处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement)

mvn generate-test-sources

生成所有包含在测试编译过程中的测试源码

mvn process-test-sources

处理测试源码,比如过滤一些值

mvn generate-test-resources

生成测试需要的资源文件

mvn process-test-resources

复制并处理测试资源文件至测试目标目录

mvn test-compile

编译测试源码至测试目标目录

mvn test

使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布

mvn prepare-package

在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本(将会在Maven 2.1+中实现)

mvn package

将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR

mvn pre-integration-test

执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境

mvn integration-test

如果有必要的话,处理包并发布至集成测试可以运行的环境

mvn post-integration-test

执行一些在集成测试运行之后需要的动作。如清理集成测试环境。

mvn verify

执行所有检查,验证包是有效的,符合质量规范

mvn install

安装包至本地仓库,以备本地的其它项目作为依赖使用

mvn deploy

复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关)

使用参数

-Dmaven.test.skip=true: 跳过单元测试(eg: mcn clean package -Dmaven.test.skip=true)

2.5 eclipse一次编译多个工程

在Maven中,允许一个Maven Project中有多个Maven Module

1.创建maven父工程步骤:new-->other-->选择maven project-->next-->勾选create a simple project-->next-->填写Group Id、Artifact Id、Version --> packaging选择pom-->finish。

2.创建maven子工程步骤:选中刚才创建的父工程右键-->new-->other-->选择maven module-->next-->勾选create a simple project-->填写module name(其实就是artifact id)-->next-->GAV继承父工程-->packaging选择你需要的-->finish。

3.完成,刷新父工程;如有多个子工程,继续按照第二步骤创建。

这时打开XXX中的pom.xml可以看到其中有以下标签

<modules>

<module>xxx1</module>

</modules>

选择编译XXX时,会依次对它的所有Module执行相同操作。

maven入门概念及使用的更多相关文章

  1. 【转】Maven 入门

    [转]http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html   Maven入门--概念与实例  最近由于工作原因在研究 ...

  2. Maven入门详解

    什么是Maven Maven,鼎鼎大名,在今天之前,我对于它一直是处于一种"只闻其名不见其人"的状态.之所以说"只闻其名",是因为Maven太有名了,它是Apa ...

  3. maven 入门

    Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这 ...

  4. Apache Maven 入门篇 ( 上 )

    作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法. 这个入门篇分上下两篇.本文着重动手,用 mav ...

  5. [转]Apache Maven 入门篇 ( 上 )

    原文地址:Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这 ...

  6. [转]Apache Maven 入门篇(下)

    原文地址: Apache Maven 入门篇(下) 作者:George Ma 第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点 ...

  7. Maven入门详解以及Eclisp的集成

    1.首先要安装Maven到操作系统上 Maven的下载页面:http://maven.apache.org/download.html Maven跟Tomcat很像,下载下来后直接解压在指定的目录就安 ...

  8. maven入门(下)

    Apache Maven 入门篇(下) 作者:George Ma 第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点接触后,接下 ...

  9. maven入门(上)

    Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这 ...

随机推荐

  1. Beamer 目录分栏

    导言区加入 \usepackage{multicol} 然后 \section*{目录} \frame{\begin{multicols}{} \tableofcontents[hideallsubs ...

  2. NB卡开卡注意事项【转】

    转自:https://blog.csdn.net/cheng401733277/article/details/83276436 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...

  3. php程序员招聘

    岗位要求:-1年以上WEB端开发经验.-熟悉PHP语言的开发工作,熟练掌握LNMP开发,并具备良好的编程风格.-熟悉 http协议,掌握css js ajax 相关技术应用.-熟悉关系型数据,NOSQ ...

  4. Windows 下安装Git工具及基础使用

    Git简介 git是很好一个工具使用,可以执行liunx命令,有git环境后windows系统就可以进行shell命令操作,就可以添加其他liunx辅助软件进行执行,git也代码库管理工具,无论是上传 ...

  5. lombok @Getter @Setter 使用注意事项

    lombok是一个帮助简化代码的工具,通过注解的形式例如@Setter @Getter,可以替代代码中的getter和setter方法,虽然eclipse自带的setter.getter代码生成也不需 ...

  6. Mac osx 系统安装 eclipse

    https://jingyan.baidu.com/article/fea4511ad46a86f7bb9125e5.html

  7. 5、Filebeat工作原理

    Filebeat工作原理 Filebeat由两个主要组件组成:inputs和harvesters. 这些组件协同工作来查看最新文件内容并将事件数据发送到指定的输出.(注意与之前版本的不同,之前版本是p ...

  8. 天梯赛 L1-043 阅览室

    L1-043 阅览室 (20 分) 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为 ...

  9. Hive SemanticException

    hive, sex='boy'); FAILED: SemanticException Line : Invalid path ''/root/data/hdata.txt'': No files m ...

  10. ionic 3 热更新 Hot Code Push

    最近用ionic 3 做的app业务做的差不多了,突然想到以后app如果有更新该怎么搞?想到我们的app后期更新应该不大,,最多就是改改bug和增加下用户体验,如果只有一些小的更新,然后提交各个应用商 ...