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:Usersgacl")

自定义jar包存放位置(本地仓库):E盘创建文件加”repository”,修改apache-maven-2.2.3conf目录下的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 targetmyapp-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.4 项目构建命令说明

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.5 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.6 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执行相同操作。

原文地址:https://www.cnblogs.com/limaosheng/p/8631616.html