4 避坑指南
- 对于多模块的项目,注意父 pom 会设置 JDK 版本,注意对齐版本号!
项目对象模型 POM
它是使用Maven工作时的基本组件,是一个xml文件。它被放在工程根目录下,文件命名为pom.xml。
POM包含了关于工程和各种配置细节的信息,Maven使用这些信息构建工程。
POM 即 Project Object Module,项目对象模型,在 pom.xml 文件中定义了项目的基本信息、源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的 url、以及构建项目所用的插件,依赖继承关系。开发人员需按照 maven 定义的规则进行 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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <! – The Basics – > <groupId> … </groupId> <artifactId> … </artifactId> <version> … </version> <packaging> … </packaging> <dependencies> … </dependencies> <parent> … </parent> <dependencyManagement> … </dependencyManagement> <modules> … </modules> <properties> … </properties> <! – Build Settings – > <build> … </build> <reporting> … </reporting> <! – More Project Information – > <name> … </name> <description> … </description> <url> … </url> <inceptionYear> … </inceptionYear> <licenses> … </licenses> <organization> … </organization> <developers> … </developers> <contributors> … </contributors> <! – Environment Settings – > <issueManagement> … </issueManagement> <ciManagement> … </ciManagement> <mailingLists> … </mailingLists> <scm> … </scm> <prerequisites> … </prerequisites> <repositories> … </repositories> <pluginRepositories> … </pluginRepositories> <distributionManagement> … </distributionManagement> <profiles> … </profiles> </project>
在每个 POM 文件中都含有的元素是该 project 的坐标,包含三个基本元素:
groupId 定义了项目属于哪个组,这有助于在大的范围上区别项目
artifactId 定义了这个项目在组中唯一的 ID,通常是工程的名称
groupId 和 artifactId 一起定义了artifact 在仓库中的位置。
name 是一个用户友好的项目名称
除了项目坐标外,modelVersion 指定 POM 模型的版本,version 指明当前项目的版本,packaging 指定了项目发布时的打包类型。
Maven 插件和仓库
Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,仅仅定义了抽象的生命周期,所有这些任务都交给插件来完成的。每个插件都能完成至少一个任务,每个任务即是一个功能,将这些功能应用在构建过程的不同生命周期中。这样既能保证拿来即用,又能保证 maven 本身的繁杂和冗余。
将生命周期的阶段与插件目标相互绑定,就可以在特定的阶段完成具体的构建任务。例如下面的代码就是要在 validate 这个阶段执行 maven-antrun-plugin 的 run 目标,具体的任务在 元素中定义。
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.6</version> <executions> <execution> <id>version</id> <phase>validate</phase> <configuration> <target> 具体任务 </target> </configuration> <goals> <goal> run </goal> </goals> </execution> </executions> </plugin> </plugins>
Maven 项目中的插件,依赖和项目构建的输出都可以由 Maven 的坐标进行唯一的区分,基于这种机制,Maven 将所有项目的构件文件放置在一个统一的位置,也就是 Maven 仓库。所有 Maven 项目可以从同一个 Maven 仓库中获取自己所需要的依赖 JAR,这节省了磁盘资源。实际的 Maven 项目中不需要存储依赖的文件,只需要在 POM 文件中生成依赖关系,在构建的时候 Maven 就会自动去仓库中下载。
在安装了 Maven 的机器上,会生成一个 ~.m2\repository 目录,这个目录被称为本地仓库,当 Maven 查找需要的依赖时,首先会在本地查找,如果本地仓库中存在,则直接使用,否则 Maven 回去远程仓库查找,查找到后下载到本地进行使用。远程中央仓库的地址为 http://repo1.maven.org/。当然还有一些镜像仓库可供使用,有兴趣的读者可以参考 Maven 官方网站的相关介绍。
当个人所在的网络无法访问公共的 Maven 仓库时,可以在 settings.xml 中设置代理服务器。打开 ~.m2\settings.xml,如果没有则复制 $Maven_HOME/conf/settings.xml 到此路径下,加入
<proxies> <proxy> <active>true</active> <protocol>http</protocol> <host> 代理地址 </host> <port>8080</port> <username> 用户名 </username> <password> 密码 </password> </proxy> </proxies>