天天看点

maven clean/install/build/package命令行详解(中)4 避坑指南项目对象模型 POMMaven 插件和仓库

4 避坑指南

  • 对于多模块的项目,注意父 pom 会设置 JDK 版本,注意对齐版本号!
maven clean/install/build/package命令行详解(中)4 避坑指南项目对象模型 POMMaven 插件和仓库

项目对象模型 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>