• maven pom的用法
  • 发布于 2个月前
  • 340 热度
    0 评论
背景
最近一段时间,业务一直在逐渐开放,为了对外提供一些底层相关的能力,需要将相关操作都封装为 SDK。对于 Java,我们一直在使用 maven,这里记录下一些 maven pom 文件使用相关的技巧。

依赖管理
依赖管理系统是 Maven 最强大的功能之一。在  pom.xml  文件中的  <dependencyManagement>  中指定依赖及其版本信息,在之后后面使用的时候,就可以不用再次指定依赖的版本号信息。这样可以有助于避免冲突,确保所有模块都使用相同版本的依赖项:
<?xml version="1.0" encoding="UTF-8"?>
<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">

  <dependencyManagement>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-grpclb</artifactId>
      <version>1.17.1</version>
    </dependency>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-grpclb</artifactId>
    </dependency>
  </dependencies>

</project>
甚至,我们可以在 <dependencyManagement> 中对依赖进行配置——例如排除某些依赖,这些后续在 <dependencies> 使用的时候,也可以不必再次指定。

插件管理
插件管理系统是 Maven 另外一个最强大的功能,类似于 <dependencyManagement>,我们可以在 <build> 下使用 <pluginManagement> 管理插件版本号,之后再在 <build> | <plugins> 使用插件的时候,就可以不用再指定版本号了。
<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.5</version>
      </plugin>
    </plugins>
  </pluginManagement>
</build>
同样类似于<dependencyManagement>,我们在 <pluginManagement> 下对 plugin 进行的配置,在后续使用的时候也不必再次进行设置。

使用 properties 管理版本号
在 pom 的  <properties> 部分,开发者可以自定义一些变量,并在后续的使用中引用这些变量。
<?xml version="1.0" encoding="UTF-8"?>
<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">

 <properties>
  <grpc-version>1.17.1</grpc-version>
 </properties>

  <dependencyManagement>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-netty</artifactId>
      <version>${grpc-version}</version>
    </dependency>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-stub</artifactId>
      <version>${grpc-version}</version>
    </dependency>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-grpclb</artifactId>
      <version>${grpc-version}</version>
    </dependency>
  </dependencyManagement>
</project>
这对于统一管理 maven 依赖的版本号非常有用,而且在下面提到的 pom 继承中,还可以在子 pom 中重写版本号。

pom 继承
如果我们使用 Spring Boot 脚手架搭建一个 Spring Boot 项目,在 pom 中可以看到下面的 parent 块:
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.7.8</version>
  <relativePath/>
</parent>
而在 dependencies 中,我们可以看到所有的依赖均没有指定版本号:
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>
这些依赖的版本号,其实都在 spring-boot-starter-parent 的 parent spring-boot-dependencies 中指定了:

但是,请注意,如果要想使得 pom 能够被继承,必须要在 pom 中指定 <packaging>pom</packaging>:

packaging 用来指定 maven 打包类型,可选值为:
jar(默认)
pom

war


pom 引用
pom 继承,只能有一个 parent,如果我们有多个版本管理的 pom 文件,例如一个是公司内部 pom ,另外一个是 Spring Boot 的,我们可以通过 指定 <scope>import</scope> 形式,来引入其他的依赖管理的 pom 文件。
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.7.8</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
关于 scope,有以下值:
compile:默认值,依赖会被传递到项目中,打包的时候也会生成该依赖。
provided:指明依赖是由运行时提供,在打包阶段,该依赖会被排除掉。
runtime:指明依赖不参与项目的编译过程,仅在运行和测试时需要。例如,接口和实现分别在两个依赖中,实现就可以指定为 runtime。
test:表示该依赖仅参与测试的过程。
system:与 provided 类似,但是需要指定依赖 jar 在本地的路径。

import:只使用在 dependencyManagement 中,表示从其他的 pom 中导入 dependency 的配置


模块组织
很多情况下,我们可能在一个项目下存在多个模块,这些模块可能都有共同的依赖,这时我们可以按照如下的目录结构组织:
D:\idea\project-name
|   pom.xml # parent
|
+---module-1
|   |   pom.xml
|   +---src
|   |   ....
|   |
+---module-2
|   |   pom.xml
|   +---src
|   |   ....
|   |
根目录下的 pom 文件,我们设置 <packaging>pom</packaging> ,并指定 parent,例如 spring-boot-starter-parent,以及在 dependencyManagement 中指定我们项目中使用的依赖版本、在 pluginManagement 中指定我们项目中使用的插件配置。
用户评论