Maven实战. 3.1编写POM
3.1编写POM
就像Make的Makefile、Ant的build.xml一样,Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。现在先为Hello World项目编写一个最简单的pom.xml。
首先创建一个名为helloworld的文件夹,打开该文件夹,新建一个名为pom.xml的文件,输入其内容,如代码清单3-1所示。代码清单3-1Hello World的POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/mavenv4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>helloworld</artifactId>
<version>1.0SNAPSHOT</version>
<name>Maven Hello World Project</name>
</project>
代码的第一行是XML头,指定了该xml文档的版本和编码方式。紧接着是project元素,project是所有pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素,虽然这些属性不是必须的,但使用这些属性能够让第三方工具(如IDE中的XML编辑器)帮助我们快速编辑POM。
根元素下的第一个子元素modelVersion指定了当前POM模型的版本,对于Maven 2及Maven 3来说,它只能是4.0.0。
这段代码中最重要的是包含groupId、artifactId和version的三行。这三个元素定义了一个项目基本的坐标,在Maven的世界,任何的jar、pom或者war都是以基于这些基本的坐标进行区分的。
groupId定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联。譬如在googlecode上建立了一个名为myapp的项目,那么groupId就应该是com.googlecode.myapp,如果你的公司是mycom,有一个项目为myapp,那么groupId就应该是com.mycom.myapp。本书中所有的代码都基于groupId com.juvenxu.mvnbook。
artifactId定义了当前Maven项目在组中唯一的ID,我们为这个Hello World项目定义artifactId为helloworld,本书其他章节代码会分配其他的artifactId。而在前面的groupId为com.googlecode.myapp的例子中,你可能会为不同的子项目(模块)分配artifactId,如myapputil、myappdomain、myappweb等。
顾名思义,version指定了Hello World项目当前的版本——1.0SNAPSHOT。SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如升级为1.0、1.1SNAPSHOT、1.1、2.0等。6.5节会详细介绍SNAPSHOT,第13章会介绍如何使用Maven管理项目版本的升级发布。
最后一个name元素声明了一个对于用户更为友好的项目名称,虽然这不是必须的,但还是推荐为每个POM声明name,以方便信息交流。
没有任何实际的Java代码,我们就能够定义一个Maven项目的POM,这体现了Maven的一大优点,它能让项目对象模型最大程度地与实际代码相独立,我们可以称之为解耦,或者正交性。这在很大程度上避免了Java代码和POM代码的相互影响。比如当项目需要升级版本时,只需要修改POM,而不需要更改Java代码;而在POM稳定之后,日常的Java代码开发工作基本不涉及POM的修改。
相关文章
- 并发和并行、线程和进程,异步和同步之间到底是什么关系?
- 基于kotlin开发的验证码发送注册的app
- kotlin基本语法
- kotlin能否取代java(kotlin的历史以及现状)
- AndroidQQ登录接入详细介绍(Kotlin搭建)
- Kotlin中的常用类及其使用
- 如何上传自己的项目到Maven中央仓库
- 彻底搞懂 React 18 并发机制的原理
- 一文带你攻克JDK新特性
- 分布式事务
- TiDB 6.5 新特性解析丨过去一年,我们是如何让 TiFlash 高效又稳定地榨干 CPU?
- jvm类加载机制
- java泛型中的通配符 T,E,K,V,?
- java的类加载
- TPS、并发数与线程数,傻傻分不清楚?
- 从 Java 的角度看待 Go 的编码规范和性能调优| 青训营笔记
- Java 对字符串操作的工具类,很全
- SQL 嵌套 N 层太长太难写怎么办?
- java基于ssm框架开发的公交查询系统源码公交系统源码公交路线查询项目有论文
- Java递归 通过递归实现累加