POM(Project Object Model,项目对象模型)文件定义了项目的基础信息,用于描述项目如何构建,声明项目依赖等等。
打开新建项目的POM文件
<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.bjsxt</groupId> <artifactId>myblog</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>myblog</name> <description>test maven hello word</description> </project>
第一行指定XML文档的版本和编码方式。
第二行指定了POM模型的版本,Maven2和Maven3都是4.0.0
后面三行就比较重要了,它定义了项目的基本坐标。
第六行说明了项目的打包方式,是一个war表示这个项目是个web项目
PS:这里还可以是jar,表示一个普通项目(如果没有packaging,那么默认就是jar)
还有POM类型,这个可以用来聚合或者继承(后面会介绍)
一、坐标介绍:
我们知道在平面中,只要给点X,Y的坐标,就可以在平面中确定唯一个点。在Maven中坐标的含义类似。即:给定groupId、artifactId、version那么就能唯一确定一个构件。
名词定义--构件:可以理解为一个项目,一个jar包,一个war包等等。
为什么需要坐标呢?
我们知道在这个世界上有海量的构件,如果没有一个唯一的标识,Maven将很难定位。为了解决这个问题,Maven定义一个规定:世界上任何一个构件都可以在Maven中找到唯一一个标识,Maven的坐标包括:groupId,artifactId,version组成。只有我们提供正确的坐标。Maven就能定位唯一构件。
坐标解释:
groupId:定义了项目属于那个组,这个组一般和公司组织相关联。例如:Apache基金组织的groupId就可以是org.apache(一般采用公司域名)
artifactId:定义当前Maven项目在组中的唯一ID。例如Apache基金下面的hadoop组织可以定义为hadoop。描述方式:org.apache:hadoop
version:指定当前项目的版本。上面的版本是0.0.1-SNAPSHOT。是一个快照版本。
版本格式:<主版本>.<次版本>.<增量版本>-<限定版本>
什么叫做SNAPSHOT(快照)版本?
项目在开发过程中是不停在更新的,这时我们的版本可以设置为快照版本。下面举个例子描述一下:
小明和小红协同开发,小红开发的B模块是依赖小明开发的A模块。如果小明更新了A模块小红该怎么做呢?
方法一:小红可以将A模块的源码拿来自己编译,但是这种方式太二了。如果项目编译报个错,小红就傻了,她得找小明帮她解决。
方法二:小明每次更新了A模块就更新A模块的版本号,那么小红可以直接更新依赖就可以得到A模块最新的版本,但是问题来了,其实每次A只是更新了一点点,这会造成版本泛滥
方法三:利用快照版本。如果小明在开发A模块时使用的是快照版本,那么小红就不用管这个依赖了,因为Maven会帮我们定时去更新最新版本的A模块。这个时间可以在updatepolicy中来设置
快照版本的实现机制?
如果一个版本包含字符串“SNAPSHOT”,Maven 就会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转换为 UTC(协调世界时)。
例如,如果你的项目有个版本为“1.0-SNAPSHOT”并且你将这个项目的构件部署到了一个 Maven 仓库,如果你在UTC2008 年 2月 7号下午 11:08 部署了这个版本,Maven 就会将这个版本展开成“1.0-20080207-230803-1”。换句话说,当你发布一个snapshot,你没有发布一个软件模块,你只是发布了一个特定时间的快照版本。
PS:还有两个版本我们可以认识一下latest版本和release版本
LATEST 是指某个特定构件最新的发布版或者快照版(snapshot),最近被部署到某个特定仓库的构件。(最新版)
RELEASE 是指仓库中最后的一个非快照版本。(发行版)
二、依赖
我们在pom.xml中添加一段依赖代码
<dependencies> <dependency> <groupId>ins</groupId> <artifactId>arch4</artifactId> <version>4.2.9</version> <exclusions>...</exclusions> <optional>...</optional> <scope>...</scope> <type>...</type> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> </dependencies>
上面这段代码表示设置了一个依赖,即在我们项目中添加了一个构件(jar包)。前面已经说过,Maven通过坐标唯一定义个构件。所以在配置依赖时,只要提供groupId,artifactId,version就可以定位一个构件
groupId,artifactId,version:设置依赖最重要的元素定位一个构件
type:依赖类型,对应项目坐标中的packaging
scope:依赖范围
optional:标记依赖是否可选
exclusions:用来排除传递性依赖
依赖范围
Maven有以下几种依赖范围:
compile:编译依赖范围(默认类型),在编译、测试、运行都起作用的依赖
test:测试依赖范围,在测试起作用的依赖
provided:已提供依赖范围,对于编译和测试classpath有效,但运行时无效。典型的例子Servlet-api,在编译和测试时需要,在运行时有容器提供
runtime:运行时依赖范围,在测试和运行classpath有效,编译时无效。典型的例子是JDBC驱动实现,项目编译时只提供JDBC接口,只有执行测试或者运行时才需要实现JDBC接口
system:略
import:导入依赖范围
上面描述中提到了编译、测试、运行classpath,这是什么意思呢?
Maven在编译项目时需要一套classpath,即:支持项目编译成功的一些jar包。Maven在编译和测试时也需要一套classpath。最典型的例子是junit测试,junit测试在测试阶段需要junit提供测试需要的依赖,但在运行时可以去掉这块的依赖。同样,Maven在运行时也需要一套classpath。依赖范围的控制就是:控制依赖与3中classpath的关系
传递依赖
如果A依赖B,B又依赖C。那么A对C来说就是传递依赖。Maven这种传递依赖为我们减少了很多负担。就用上面的简单例子:A依赖B,B依赖C。我们只需要在pom.xml中添加B的依赖。那么Maven自动帮我们附加了对C的依赖。想像一下,在以前我们开发web项目时,将所有依赖的jar考到lib下面。你还要考虑B依赖的jar包有哪些,这些jar包还不能缺了。现在就不用管这些问题了。
传递依赖和依赖范围的关系
问题描述:
A依赖B,B依赖C。
A对B是第一直接依赖
B对C是第二直接依赖
A对C是传递依赖
第一直接依赖的范围和第二直接依赖的范围决定了传递依赖的范围
X轴表示第二直接依赖范围
Y轴表示第一直接依赖范围
X轴和Y轴的交点就表示传递依赖的范围
依赖冲突
有下面这种情况:
项目A有这样的依赖关系:A-->B-->C-->Z(1.0);A-->D-->Z(2.0)这样就造成了Z在项目中出现两个版本。Maven是怎么处理这种问题的呢?
第一原则:路劲最近者优先,其中Z(1.0)路径为3。Z(2.0)路径为2 所以选择Z(2.0)
第二原则:如果路径相同,那么使用第二原则,谁在pom中先被声明就用谁
相关推荐
标题中的“pom.zip_java maven_pom mainfest java_pom manifest 标签_pom 文件 mani”暗示了我们讨论的主题是Maven项目中的`pom.xml`文件与Manifest文件的关联。Manifest文件在Java应用程序和库中用于记录元数据,如...
2. **依赖管理**: Maven自动解决项目依赖关系,通过在POM中声明所需的库,Maven会自动下载并管理这些库,避免版本冲突问题。 3. **坐标**: Maven中的每个项目都有唯一的坐标,包括groupId(组织或公司名)、...
2. **项目对象模型(POM)**:POM是Maven的核心,包含了项目的基本信息,如项目名称、版本、描述、开发者信息,以及项目依赖、构建目标等。它是Maven自动化的基础。 3. **依赖管理**:Maven通过声明式的方式管理项目...
1. **项目对象模型(POM)**:Maven的中心概念,POM是一个XML文件,包含了项目的信息如依赖、构建配置、插件等,使得Maven能理解如何构建项目。 2. **依赖管理**:Maven通过中央仓库自动下载项目所需的库,避免了...
1. **项目对象模型(Project Object Model,POM)**:Maven的核心是POM,它是Maven项目的配置文件,定义了项目的基本信息、依赖、构建过程等。POM.xml文件位于项目的根目录下,是Maven进行所有操作的基础。 2. **...
2. **配置pom.xml**:在`pom.xml`中添加Spring MVC、Spring、Hibernate和其它相关依赖的坐标。 3. **配置Spring**:编写`applicationContext.xml`或`dispatcher-servlet.xml`,定义bean、数据源、事务管理器以及...
3. **依赖管理(Dependency Management)**:Maven通过POM管理项目依赖关系,自动下载所需的库文件,避免了手动管理jar包的繁琐工作。 4. **生命周期(Lifecycle)**:Maven有一套预定义的构建生命周期,包括clean...
Maven通过一个叫做pom.xml的项目对象模型文件来配置项目构建的各个方面,其中标签是Maven构建配置的核心部分,它定义了整个构建生命周期中需要执行的指令和任务。 Maven构建包括编译代码、执行测试、打包以及部署等...
Maven的核心概念主要包括项目对象模型(Project Object Model,POM)、依赖管理、插件以及生命周期。POM是Maven的核心,它定义了一个项目的配置信息,包括项目的基本信息、依赖关系、构建目标等。通过POM.xml文件,...
- **POM**: Maven的核心是项目对象模型(POM),它是XML格式的配置文件,用于描述项目结构、依赖关系等信息。 - **核心概念**: - **Maven插件**: 提供具体的功能,如编译源代码、生成文档等。 - **生命周期**: ...
POM是Maven的核心,是一个XML文件,包含了关于项目的基本信息,如依赖、构建配置、插件设置等。通过POM,Maven可以自动解决项目依赖,执行构建任务,生成文档,并执行测试。POM使得多个项目共享相同的构建逻辑变得...
- **项目对象模型(Project Object Model, POM)**: Maven项目的核心是POM,它是项目元数据的XML文件,包含了项目的配置信息,如项目依赖、构建目标、插件设置等。 - **坐标(Coordinates)**: Maven项目通过一组...
- **项目对象模型(Project Object Model, POM)**:是Maven的核心,它是一个XML文件,包含了项目的基本信息、依赖、构建配置等。 - **坐标(Coordinates)**:包括groupId、artifactId和version,用于唯一标识一...
在POM中声明所需依赖,Maven会根据设定的坐标(groupId、artifactId、version)从Maven中央仓库或其他指定的远程仓库下载对应的jar包。例如,`<dependency>`标签用于声明项目依赖,`<dependencies>`标签则用于包含...
** Maven的介绍与安装 ** Maven是一款强大的项目管理和依赖管理工具,广泛应用于Java开发领域。它通过XML格式的配置文件(pom.xml)来管理项目的构建、报告和依赖关系,使得项目构建过程标准化,降低了多模块项目...
POM.xml文件是每个Maven项目的核心配置文件,它包含了项目的元数据、构建指令以及依赖列表。 首先,让我们了解POM.xml文件的结构。POM通常包含以下元素: 1. `<project>`:整个配置的根元素。 2. `<modelVersion>`...
通过在`pom.xml`中声明依赖,Maven会自动下载并管理这些依赖及其依赖的依赖,极大地简化了项目的构建过程。此外,Maven还支持范围(scope)的概念,如`compile`、`runtime`、`test`等,以便在不同阶段使用不同的依赖...
- **依赖版本管理**:通过Maven的坐标系统(坐标包括组ID、构件ID、版本号、打包方式等),可以方便地管理项目的依赖版本。 - **远程仓库**:如果本地仓库中没有找到所需的依赖,Maven会自动从远程仓库下载。常见的...
Maven 项目 pom.xml 文件中的 parent 标签是 Maven 项目管理依赖的核心组件之一。parent 标签的使用可以简化项目间的依赖管理,使得项目结构更加清晰、易于维护。 Maven 项目中的依赖管理 在 Maven 项目中,依赖...