Maven学习-优化和重构POM

时间:2025-05-02 19:34:32

  在一个复杂的项目中,项目的各个模块存在各种相互依赖关系。优化一个多模块项目的POM最好通过几步来做。总的来说,我们总是寻找一个POM中的重复或者多个兄弟POM中的重复。在多模块项目中依赖重复的模式主要包括①:一些依赖在多个模块中被生命;②有一些依赖关系是关联的,共享同样的版本③:兄弟模块依赖和兄弟模块版本的重复。Maven提供简单的机制能让你将所有的依赖重构到一个父POM。重复的依赖声明很难保证一个大项目中版本的一致性。我们可以找出所有被应用一次以上的依赖,然后将其向上移动到父POM的dependencyMangement片段。如下所示:

<?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">
<modelVersion>4.0.0</modelVersion> <groupId>com.netease.parent</groupId>
<artifactId>demo</artifactId>
<packaging>pom</packaging>
<version>1.0.3-RELEASE</version>
<modules>
<module>demo-child</module>
</modules> <properties>
<commons-logging.version>1.2</commons-logging.version>
<commons-io.version>2.4</commons-io.version>
...
</properties> <dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons-logging.version}</version>
</dependency> <dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
...
</dependencies>
</dependencyManagement>
</project>

在这些依赖配置被上移后,我们需要移除子模块的依赖版本,否则会覆盖定义在父项目的依赖。如下:

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
...
</dependencies>

为降低依赖重复主要使用了两种优化①:上移共同的依赖至dependencyMangement②为兄弟项目使用内置的项目version和groupId。

优化插件

  dependencyMangement不适用于插件依赖管理,我们可以使用build元素下的pluginManagement来管理。

<project>
...
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
...
</plugins>
</pluginManagement>
</build>
...
</project>

使用MVN Dependency进行优化

  通过字节码分析Maven Dependency插件能够帮助发现对依赖的直接应用。mvn dependency:analyze  通过该目标分析项目,查看是否有直接依赖或者一些引用了但不是直接声明的依赖。为了进一步排查运行 mvn  dependency:tree目标,该目标会列出项目中所有的直接依赖和传递性依赖。