Maven(5)-优化和重构POM

本文主要介绍如何优惠pom,杜绝重复(DRY)。

1)模块重复依赖;

2)坐标版本号重复;

3)兄弟依赖

一、项目骨架

上图说明:

  1. multi-module-project是一个有多个模块构成的项目,模块分别为:web-service、web-app、web-dal
  2. web-service、web-app、web-dal分别依赖与log4j
  3. web-app同时依赖web-service和web-dal,因为这三个模块属于同一个project,所以这种依赖叫做兄弟依赖。

 二、模块重复依赖

2.1 问题

由于三个模块同时依赖与log4j组件,如果在web-service,web-app,以及web-dal的pom文件中分别都加入对log4j的依赖(首先,这是可以的)就会出现一个问题:当log4j有新的版本出现,且自己的项目想引入这个新版本,由于每个模块都配置了对log4j的依赖,那么就需要在每个模块的pom文件中进行修改,工作量很大,且如果模块多,类似的重复依赖也多,就容易出现有些模块漏修改的问题,容易产生问题。

该问题就犹如有很多重复代码大量存在于不同的模块,当有针对这块重复代码逻辑修改的时候,就需要大量的人力去到处修改,且容易出错。怎么办?代码中的问题可以通过把这个重复代码单独封装,然后多出进行调用。这样有需求变动时只需要修改一个地方即可。

2.2 解决方案

maven的pom文件优化类似,maven中可以将这些子模块中相同的依赖移到父模块的dependencyManagement节点。

最佳实践:如果有两个以上的子模块共同依赖一个组件,那么对于这个组建的依赖就应该放在父模块的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">
    <modelVersion>>4.0.0</modelVersion>

    <groupId>com.cnblogs.kmpp</groupId>
    <artifactId>multi-module</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>web-app</module>
        <module>web-service</module>
        <module>web-dal</module>
    </modules>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</dependencyManagement>
</project>

当然如果将依赖移到父模块的dependencyManagement模块后,需要在子模块中将对应的依赖删除,否则,子模块的配置会覆盖父模块的配置。

三、版本号重复

3.1 问题演示

 <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.3.0.ga</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>3.3.0.ga</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate</artifactId>
             <version>3.2.5.ga</version>
        </dependency>
    </dependencies>

上面的pom配置中作为org.hibernate下面的组件,版本号重复了,一般来说,一个组织(groupid)下面的组件的版本号是一致的,且一起更新,和上面说的多个模块重复依赖一个组件类型,当同一个版本号多处出现时,如果修改,就会出现工作量大且有漏修改的风险。

3.2 解决

使用属性元素(property),统一定义版本号,多处进行使用:

<properties>
    <hibernate.annotations.version>3.3.0.ga</hibernate.annotations.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>${hibernate.annotations.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>${hibernate.annotations.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate</artifactId>
            <version>${hibernate.annotations.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

这样当org.hibernate的版本号变化的时候只需要修改以地方。其实版本号类似于程序里面的magic number。不管是不是多次使用,最好都通过定义property来实现,上面的junit的版本号也应该预先在property中进行定义,然后再使用。

四、兄弟依赖

4.1 问题

web-app依赖web-dal和web-service组件

        <dependency>
            <groupId>com.cnblogs.kmpp</groupId>
            <artifactId>web-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.cnblogs.kmpp</groupId>
            <artifactId>web-dal</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

上面的依赖同样有重复:groupId和version。

4.2 解决

因为web-app、web-dal以及web-service作为兄弟模块他们的groupId和version是和父模块是一样的。所以兄弟依赖的groupId和version可以使用父模块的数据:

   <dependency>
            <groupId>${parent.groupId}</groupId>
            <artifactId>web-service</artifactId>
            <version>${parent.version}</version>
        </dependency>
        <dependency>
            <groupId>${parent.groupId}</groupId>
            <artifactId>web-dal</artifactId>
            <version>${parent.version}</version>
        </dependency>

当然,兄弟依赖的重复也可以通过property来定义解决,但是没有直接使用父模块属性方便。

五、maven 依赖分析

maven已经提供了命令:

  1. mvn dependency:analyze,使用该命令就可以看到maven分析的结果和建议
  2. mvn dependency:tree,使用该命令可以看到maven的依赖树。

六、结束语

DRY works everywhere and always will do.

时间: 2024-12-23 06:50:49

Maven(5)-优化和重构POM的相关文章

根据自己的需要,把别人开发好的东西搬过来,优化and重构,在优化的过程中,甚至也会弄出一套全新的东西(转)

赵海平在今年三月份来到阿里,听毕玄(他现任主管)说去年五六月份就跟赵海平聊上了.有人问:为啥 BAT 三大巨头,你看中了阿里巴巴?在今天现场达一千多人的分享中赵海平给出了回复:“因为百度和腾讯没找我呗~”,他笑道,“百度以搜索为核心,优化了很多年了,估计也没啥可以优化的了:而腾讯除了 QQ 和微信,也没什么大型应用(别跟人家说哦)”.这不是原话哈,赵海平还是相当谦虚并且能言的,思维很开阔,两个小时的分享内容丰富,时不时还插两个故事,起初进场的手机和电脑都很自觉的收起来了~旁边的同事侃道:“高 P

Maven管理SSM框架的pom.xml文件配置(自动下载所依赖的jar包)

<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&

优化与重构的思考

看这篇文章:http://www.cnblogs.com/greyzeng/p/4077732.html 对评论引发我的思考. 网上有人说这句话我赞同: 优化和重构是两个概念啊,楼主还是没有搞清楚优化不宜过早主要指的是性能的优化不宜过早,因为很多性能优化其实没有对系统有明显的提升.而重构主要指的是修正代码中不好的味道,提高代码的可读性和可扩展性 优化的确不宜过早,但是重构是应该持续在整个开发过程中的当需求比较稳定的时候,就应该考虑通过重构来整理代码 另外一个人的观点: 我们的做法是,将重构这件事

maven文件报错(pom.xml或者jar包缺失)解决方法

相信很多朋友在myeclipse上把maven配置好了,但是新建maven项目的时候会报错,下面我来总结以下我遇到的问题. 新建完maven项目后,pom.xml报错 1.报错的原因:很多时候我们在下载maven的时候会因为网络问题导致下载的jar包不全或者丢失,当新建完一个maven项目的的时候pom.xml就会报错. 2.解决办法:点击报错的地方,它会自动提示你报错的地方,例如: 很明显,这是jar包缺失的表现.这时候我们就要去c盘.m2文件夹下的repository目录下去寻找这个对应的j

IDEA创建maven项目报错解决:Failed to create a Maven project: &#39;C:/Users/../IdeaProjects/../pom.xml&#39; already e

晚上用IDEA创建Java的maven项目时报错了: Failed to create a Maven project: 'C:/Users/../IdeaProjects/../pom.xml' already exists in VFS1这个错误是因为之前我已经在这个文件夹里创建过同名的maven项目. 解决方法如下: 先把这个项目删了,然后把回收站中的这个项目和之前同名的项目一起彻底删除,重新创建一遍就不会报错了 IDEA创建maven项目报错解决:Failed to create a M

step4-----&gt;往工程中添加Spring的子项目spring IO Platform-------&gt;通过maven添加相关框架(pom.xml)

添加Spring IO Platform的目的: 避免自己的project的外部依赖(external dependencies)之间产生版本冲突问题.更多详细信息参见:Spring IO Platform概述 具体操作步骤: step1,往自己的工程中添加Spring IO Platform 编写project的pom.xml,添加如下代码,引入Spring IO Platform <dependencyManagement> <dependencies> <depende

eclipse中基于maven构建的web项目pom.xml中指定的jar包无法发布到tomcat中

eclipse运行maven web项目报错: 信息: Starting Servlet Engine: Apache Tomcat/7.0.57 一月 07, 2015 11:50:44 下午 org.apache.catalina.core.ContainerBase startInternal 严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catal

maven建ssh项目的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&

Maven常用命令大全与pom文件讲解

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲解是Maven使用过程中一些常用的命令,并配上图片说明,最后还讲了pom.xml文件的一些构造. 一.Maven常用命令 1.1.Maven 参数 -D 传入属性参数 -P 使用pom中指定的配置 -e 显示maven运行出错的信息 -o 离线执行命令,即不去远程仓库更新包 -X 显示maven允许的debug信息 -U 强制去远程参考更新snapshot包 例如 mvn i