Maven使用
标签:Maven

Maven

Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

项目的生命周期

传统项目构建,每个环节都需要人工手动完成, Maven是自动化项目构建工具 ,帮助自动完成整个项目构建

1. settings.xml 和仓库

$user.home/.m2/repository/settings.xml为用户范围的配置文件

$M2_HOME/conf/settings.xml为全局范围的配置文件,修改后将影响本机所有用户的配置

建议:只修改用户级别的配置,既不影响其它用户,也不影响后期升级。

配置介绍

localRepository: 自定义本地库路径,默认在$user.home/.m2中

interactiveMode

offline:是否每次编译都去查找远程中心库

pluginGroups:插件组,例如org.mortbay.jetty

proxies:通过代理访问外部库

servers:集成认证服务,例如集成Tomcat

mirrors:镜像库,可以指定内部中心库

profiles:个性配置,需要在Activation标签中激活

activeProfiles:表示激活的profile

2. Maven名词解释

Project:任何您想build的事物,Maven都可以认为它们是工程。这些工程被定义为工程对象模型(POM,Poject Object Model)。一个工程可以依赖其它的工程;一个工程也可以由多个子工程构成。

POM:POM(pom.xml)是Maven的核心文件,它是指示Maven如何工作的元数据文件,类似于Ant中的build.xml文件。POM文件位于每个工程的根目录中。

GroupId:groupId是一个工程的在全局中唯一的标识符,一般地,它就是工程名。groupId可以使用一个完全的包名,将一个工程从其它有类似名称的工程里区别出来。

Artifact:artifact 是工程将要产生或需要使用的文件,它可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId和 artifactId组合的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中,否则Maven无法找到 (识别)它们。

Dependency:为了能够build或运行,一个典型的Java工程会依赖其它的包。在Maven中,这些被依赖的包就被称为dependency。dependency一般是其它工程的artifact。

Plug-in:Maven是由插件组织的,它的每一个功能都是由插件提供的。插件提供goal(类似于Ant中的target),并根据在POM中找到的元数据去完成工作。主要的Maven插件要是由Java写成的,但它也支持用Beanshell或Ant脚本写成的插件。

Repository:仓库。

3. 通过命令行构建

  1. mvn archetype:generate:按照提示进行选择
  2. mvn archetype:generate -DgrounpId=com.liuyao.maven04 -DartifactId=maven04-demo -Dversion=1.0.0SNAPSHOT -Dpackage=com.liuyao.maven04-demo

加个参数 -DarchetypeCatalog=internal 可以避免maven不要从远程服务器上获取catalog,以免卡住

4. 常用maven 命令行指令

dependency:sources -U:导入Jar包后关联源码

5. Maven项目的生命周期

生命周期依次执行,运行后面的命令,前面的都要执行

6. 转换为工程

转换Eclipse工程 (在pom.xml目录执行)

转换成IDEA 工程(在pom.xml目录执行)

显示一个插件的详细信息(configuration, goals等):

7. Maven 核心概念

7.1 仓库

远程公用仓库

内部中心仓库

本地仓库

7.2 坐标

打包方式(packaging)

项目在打包后,产生怎么样类型文件

(jar 将项目制作为jar包, 被其它项目依赖 , war 独立运行javaweb项目,pom 被其它项目继承 )

8. 依赖

<dependency>
      <groupId>……</groupId>
      <artifactId>……</artifactId>
      <version>……</version>
      <classifier>……</classifier>
      <scope>……</scope>
      <type>……</type>
      <systemPath>……</systemPath>
      <optional>……</optional>
      <exclusions></exclusions>
</dependency>

<exclusions></exclusions>排除传递依赖 (主要解决jar冲突问题 )

8.1 依赖范围scope

<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>servlet-api</artifactId>
  		<version>2.5</version>
  		<scope>provided</scope>
  	</dependency>
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>jsp-api</artifactId>
  		<version>2.0</version>
  		<scope>provided</scope>
</dependency>

<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  		<version>4.9</version>
  		<scope>test</scope>
	</dependency>

依赖范围 对于编译classpath 有效 对于测试classpath 有效 对于运行时classpath 有效 例子
compile Y Y Y spring-core
test - Y - Junit
provided Y Y - servlet-api
runtime - Y Y JDBC驱动
system Y Y - 本地的,Maven仓库之外的类库

8.2 依赖调节

A->B->C->D->X(1.6)
A->D-X(2.0)

X是A的传递依赖

调解原则

第一原则:路径近者优先原则

2.0传递给A最近

第二原则:第一声明者优先原则

当路径相等时,则由POM声明的依赖顺序决定

8.3 依赖调剂技巧

8.3.1 版本统一维护

<properties>
 	 	<spring.version>3.2.0.RELEASE</spring.version>
</properties>

<!-- 导入spring -->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-core</artifactId>
  		<version>${spring.version}</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-beans</artifactId>
  		<version>${spring.version}</version>
  	</dependency>

8.3.2 防止传递性依赖导入冲突

<!-- 路径最短,优先导入 -->
  	<dependency>
  		<groupId>commons-logging</groupId>
  		<artifactId>commons-logging</artifactId>
  		<version>1.1.1</version>
  	</dependency>

如果不是传递性依赖,导入两个相同坐标,不同版本,后导入坐标覆盖了之前的坐标 !

9. 多模块和继承

9.1 多模块

9.2 继承

<artifactId>ordermanager</artifactId>
  <name>ordermanager</name>
  <!-- 配置父项目 -->
  <parent>
  	<groupId>cn.itcast.maven.modules</groupId>
	<artifactId>myparent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
  </parent>

儿子从父亲继承 groupId和version ,还有其它依赖配置

多模块不等于继承! 多模块和继承都可以单独使用,多模块强调一个项目对所有子模块进行构建,继承强调配置复用,在实际开发中多模块和继承 通常是一起使用的!


扩展阅读:

maven设置------setting.xml文件学习

  • 10 min read

CONTRIBUTORS


  • 10 min read