2-Maven-pom配置

本文主要记录下博主在实际工作中常用的且感觉有必要记录的相关标签。

POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。

pom.xml和settings.xml区别是 :前者是项目级别配置 后者是属于全局配置。

项目基本配置

maven 坐标

<!--组织ID-->
<groupId>com.bocloud</groupId>
<!--项目ID-->
<artifactId>bocloud.cop</artifactId>
<!--版本号-->
<version>6.5.1-SNAPSHOT</version>
<!-- 项目的类型 -->
<packaging>pom</packaging>
<description>BoCloud Cloud Operation Platform</description>

在 maven 中,根据 groupIdartifactIdversion 组合成 groupId:artifactId:version 来唯一识别一个 jar 包。

  • groupId :团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。一般对应着 java 的包结构。

  • artifactId : 单独项目的唯一标识符。比如我们的 tomcat、commons 等。

  • version :一个项目的特定版本。maven 在版本管理时候可以使用几个特殊的字符串 SNAPSHOT、LATEST、RELEASE。比如 1.0-SNAPSHOT。各个部分的含义和处理逻辑如下说明:

    • SNAPSHOT - 这个版本一般用于开发过程中,表示不稳定的版本。
    • LATEST - 指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个 snapshot 版,具体看哪个时间最后。
    • RELEASE :指最后一个发布版。
  • packaging:项目的类型,描述了项目打包后的输出,默认是 jar。常见的输出类型为:pom, jar, maven-plugin, ejb, war, ear, rar, par。

    pom:父类型都为pom类型

    jar:内部调用或者是作服务使用(默认)

    war:打包项目,用于在容器(Tomcat、Jetty等)上部署

dependencies 依赖配置

dependencies标签主要用于管理项目中需要引入的其他依赖。

<dependencies>
    <dependency>
     <groupId>org.apache.maven</groupId>
      <artifactId>maven-embedder</artifactId>
      <version>2.0</version>
      <!--依赖类型-->
      <type>jar</type>
      <!--类别(类目)-->
      <classifier></classifier>
      <!--指定依赖的范围-->
      <scope>test</scope>
      <!--指定本地jar路径,和scope一起使用-->
      <systemPath></systemPath>
      <!--指定是否需要被依赖-->
      <optional>true</optional>
      <!--排除依赖列表-->
      <exclusions>
        <exclusion>
          <groupId>org.apache.maven</groupId>
          <artifactId>maven-core</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    ...
  </dependencies>

scope :此元素指的是任务的类路径(编译和运行时,测试等)以及如何限制依赖关系的传递性。有 5 种可用的限 定范围。

compilemaven的默认范围,作用在所用范围可以依赖传递
provided只在编译和测试时生效,正式发布jar包或者war包时 该依赖不会被包含进去不会传递
runtime只在运行时和测试时生效,典型的是数据库驱动依赖可以依赖传递
test只在测试时生效不会依赖传递
system表明该依赖不会从中央仓库查找,而是从用户指定的systemPath位置获取,与systemPath共同使用

systemPath:

仅当scope为system时才可以使用。否则,如果设置了这个元素,构建时将会失败。systemPath的路径必须是绝对路径,这里可以利用properties的属性来指定。例如${java.home}/lib。
官方建议如无必要不要用此方式,可以先将依赖安装到maven仓库后在做引入。

exclusions:

排除依赖中不需要的项。

optional:

默认值:false。optional=true 表示此依赖包不会在其他项目中被引用加载、不参与maven的依赖传递。

dependencyManagement 依赖声明

dependencyManagement 的一个使用案例是当有父子项目的时候,父项目中可以利用 dependencyManagement 声明子项目中需要用到的依赖 jar 包,之后,当某个或者某几个子项目需要加载该依赖的时候,就可以在子项目中 dependencies 节点只配置 groupIdartifactId 就可以完成依赖的引用。dependencyManagement 主要是为了统一管理依赖包的版本,确保所有子项目使用的版本一致,类似的还有pluginspluginManagement

properties 属性

属性列表。定义的属性可以在 pom.xml 文件中任意处使用。使用方式为 ${X}

<properties>
    <maven.compiler.source>1.7<maven.compiler.source>
    <maven.compiler.target>1.7<maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

补充:

路径说明示例
${env.X}平台系统环境变量windows、或者linux系统的环境变量,
例如:${env.JAVA_HOME}可以获取JAVA_HOME的路径。
命令行运行:mvn help:system查看所有可用平台系统环境变量
${project.X}pom文件中project
根标签下的变量
按照官方文档的解释:
当前POM文件中project根标签下的标签值
都可以通过${project.X}的方式来获取。
例如:${project.version}
具体哪些标签可参考官方文档:maven-model
${settings.X}maven安装目录:
conf->settings
配置文件里面的属性
例如:
通过${settings.localRepository}
可以获取settings配置文件中的本地仓库路径
${X}Java系统属性例如:通过${java.runtime.version}
可以获取java运行版本。
命令行运行:mvn help:system查看所有可用Java系统属性

modules 子模块

标签用于声明当前 Maven 项目包含的模块子项目,每个子项目都是一个独立的 Maven 项目,具有自己的 pom.xml 文件,可以进行独立构建和测试。在父项目的 pom.xml 文件中,使用 标签来列出所有子项目的名称。

<modules>
    <module>bocloud.cop.booter</module>
    <module>bocloud.cop.service</module>
    <module>bocloud.cop.repository</module>
    <module>bocloud.cop.entity</module>
</modules>

parent 父模块

标签用于声明当前 Maven 项目的父项目,它可以将若干个 Maven 项目组织成一个整体,指定版本号,插件版本号等,便于管理和维护,在一个 Maven 项目中,使用标签来引用父项目。

<parent>
    <artifactId>bocloud.cop</artifactId>
    <groupId>com.bocloud</groupId>
    <version>6.5.1-SNAPSHOT</version>
</parent>

repositories 仓库配置

在pom文件中支持指定Maven仓库,即使用 和 标签,用于指定一个Maven仓库。如果是私服的话 需要配置用户名密码等权限信息,要结合settings.xml中的server标签一起使用,通过彼此id进行关联。(具体可以看我Maven-setttings这篇文章)。另外全局的仓库配置是放在settings.xml文件中的。

<repositories>
    <repository>
        <id>projectlombok.org</id>
        <name>Maven仓库的名称</name>
        <url>https://projectlombok.org/edge-releases</url>
    </repository>
</repositories>

pluginRepositories 插件配置

同repositories 仓库设置

<pluginRepositories>
    <pluginRepository>
        <id>public</id>
        <name>nexus</name>
        <url>https://mirrors.njh.cloud.com/repository/maven/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

distributionManagement 推送

通过mvn deploy 将当前项目的jar包推送到指定仓库中。如果是私服的话 需要配置用户名密码等权限信息,要结合settings.xml中的server标签一起使用,通过彼此id进行关联。(具体可以看我Maven-setttings这篇文章)

<distributionManagement>
    <!-- 正是版本的仓库地址配置 -->
    <repository>
        <id>bocloud</id>
        <name>BoCloud Release</name>
        <url>${release.server.url}</url>
    </repository>
    <!-- snapshot版本的仓库地址配置 -->
    <snapshotRepository>
        <id>bocloud-snapshot</id>
        <name>BoCloud Snapshot</name>
        <url>${snapshot.server.url}</url>
    </snapshotRepository>
</distributionManagement>
  1. 对于正式的发布,在POM中配置给出远程库的url;
  2. 对于非正式的发布,还可以在POM中配置给出远程仓库的url
  3. 项目的POM中配置只给出了远程库的url,要配置访问远程库的username/password,还需要在settings.xml中配置;

项目构建配置

build 构建信息

用于定义项目的构建配置,包括源代码目录、资源目录、插件等。

<build>
    <!-- 插件管理:用于定义Maven插件的列表。Maven插件可以用来执行各种任务,例如编译代码、运行测试、打包和发布项目等 -->
	<plugins></plugins>
    <!-- 资源管理:用于定义资源的配置,例如在构建过程中要处理的属性文件或资源文件 -->
    <resources>
      <resource>
        <directory>src/main/resources</directory>
      </resource>
    </resources>
    <!-- 类似于<resources>,但是用于配置测试资源,例如在测试过程中要处理的属性文件或资源文件 -->
	<testResources></testResources>
    <!-- 用于指定项目的源代码目录 -->
	<sourceDirectory></sourceDirectory>
    <!-- 用于指定项目的输出目录,例如生成的JAR文件或WAR文件 -->
	<outputDirectory></outputDirectory>
    <!-- 用于定义项目的过滤器,例如在构建过程中要应用的属性文件过滤器。 -->
	<filters></filters>
    <!-- 用于指定项目的最终名称,例如生成的JAR文件的名称。 -->
	<finalName></finalName>
	<pluginManagement></pluginManagement>
</build>

需要注意的是,像资源目录这种路径是没有默认值的,但根据Maven的约定优于配置原则(Convention over Configuration),Maven会使用默认的目录结构去查找源代码和测试代码。默认的目录结构如下:

project
|--src
   |--main
      |--java  // Java主源代码目录
      |--resources // 资源文件目录
   |--test
      |--java // 测试主代码目录
      |--resources // 测试资源文件目录

因此,在一个标准的Maven项目中,sourceDirectory默认值应该是src/main/java。如果有自定义的代码目录结构,需要显式地设置sourceDirectory元素的值。例如,如果有一个名为“core”的子目录作为项目的主源代码目录,可以按以下方式进行配置:

<build>
  <sourceDirectory>core</sourceDirectory>
  ...
</build>

profiles 环境配置

profiles用于定义 Maven 运行时的不同配置环境,比如开发环境、测试环境、生产环境等,可以在不同的环境中使用不同的配置,比如我们做了如下配置:

<profiles>
    <profile>
        <id>bocloud.booter.tomcat</id>
        <activation>
        <!--设置默认激活-->
        <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <bocloud.booter.version>${bocloud.cop.version}</bocloud.booter.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.hibernate.validator</groupId>
                        <artifactId>hibernate-validator</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </profile>
</profiles>

详情可以参考我的另一篇文章:Maven-settings 中关于profile的讲解

注:

​ 在Maven中激活profile命令:mvn clean install -Pprod

plugins 插件配置

plugins的作用是定义 Maven 插件, plugins 主要用于扩展 Maven 的功能,帮助开发人员更方便地构建、打包、发布项目。插件可以通过 Maven 的插件中心或者自己构建的私有仓库来使用,能在构建过程中执行特定的任务,比如编译、打包、测试等。

关于插件的详解和使用单独放在一篇文章中:Maven-plugins

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部