Maven高级使用指南

news2024/11/24 7:16:48

在开发大型项目时,Maven作为一个强大的构建和项目管理工具,能显著提升项目管理和构建的效率。然而,随着项目的扩大,维护和管理的复杂性也随之增加。本文将探讨一些高级的Maven用法和解决方案,以帮助你更好地管理大型项目

1. 项目分模块管理

在处理大型项目时,项目的复杂性和规模会显著增加,使得维护和复用变得困难。为了解决这些问题,常见的做法是将一个大项目拆分为多个模块,每个模块负责处理不同的功能或业务逻辑。这种做法不仅可以提高代码的组织性,还能促进模块的重用。

问题:重复配置依赖

在一个多模块的项目中,每个模块通常需要引入相同的依赖库。如果在每个模块的pom.xml文件中都重复配置这些依赖,会导致以下问题:

  • 维护难度增加:当依赖版本需要更新时,必须在每个模块中进行修改,容易遗漏或出错。
  • 冗余配置:重复的配置增加了项目的复杂度和维护成本。
  • 版本冲突:如果不同模块使用了不同版本的相同依赖,可能导致兼容性问题。

解决方案:引入父工程

为了简化依赖管理,Maven提供了继承机制,通过创建一个父工程(Parent Project),可以在父工程中集中管理所有公共的依赖和插件配置。这种方式可以显著减少重复配置,提高项目的可维护性。

步骤如下:

  • 创建父工程:首先,创建一个父工程,其pom.xml文件中只包含依赖和插件的配置,不包含实际的业务代码。(父工程的打包方式设为pom)

  • 父工程的pom.xml示例

  

<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/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.3.8</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.12.0</version>
            </dependency>
            <!-- 更多公共依赖 -->
        </dependencies>
   

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <!-- 更多公共插件 -->
            </plugins>
        </pluginManagement>
    </build>

    <modules>
        <module>module-a</module>
        <module>module-b</module>
        <!-- 更多子模块 -->
    </modules>
</project>

子模块继承父工程:在每个子模块的pom.xml文件中,指定父工程,并使用父工程中定义的依赖和插件配置。

子模块的pom.xml示例

<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/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0</version>
        <relativePath>../parent-project/pom.xml</relativePath>
    </parent>
    <artifactId>module-a</artifactId>

   
</project>
2. 版本管理

在多模块项目中,管理不同模块之间的版本变得尤为重要。如果每个模块都单独管理版本,容易导致不一致的情况。

解决方案

在父工程中使用<dependencyManagement>标签统一管理依赖版本。这个标签仅定义依赖版本,但不会将依赖实际引入到构建中。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <!-- 更多依赖 -->
    </dependencies>
</dependencyManagement>

此外,可以使用<properties>标签定义版本号等属性,方便统一管理。


    <properties>
        <project.version>0.0.1</project.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <java.version>11</java.version>
        <cloud.version>2021.0.1</cloud.version>
        <cloud-alibaba.version>2021.0.1.0</cloud-alibaba.version>
        <mysql.version>8.0.26</mysql.version>
        <druid.verison>1.2.11</druid.verison>
   
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--SpringCloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--SpringCloudAlibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- security -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-security</artifactId>
                <version>${security.version}</version>
            </dependency>
            <!-- oauth2 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-oauth2</artifactId>
                <version>${oauth2.version}</version>
            </dependency>
            <!-- rabbitmq -->
           
        </dependencies>
    </dependencyManagement>
  • dependencies:用于实际引入依赖库,定义了项目的实际依赖项,包括依赖的版本。
  • dependencyManagement:用于集中管理依赖的版本信息,子模块可以使用这些版本信息,但不直接引入这些依赖。
3. 聚合构建

在多模块项目中,单独构建每个模块可能会比较繁琐。通过Maven的聚合功能,可以将多个模块组织成一个整体进行构建。

解决方案

创建一个聚合工程(父工程),它只包含一个pom.xml文件,没有业务代码,通过<modules>标签列出所有子模块。然后,在聚合工程目录下执行mvn install,Maven会自动构建所有子模块。

示例

<project>
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <modules>
        <module>module-a</module>
        <module>module-b</module>
        <!-- 更多模块 -->
    </modules>
</project>

 

4. 私服配置

在团队开发中,共享自定义的JAR包时,将其上传到中央仓库是不现实的,通常公司会搭建自己的私有Maven仓库。

使用私服,需要在maven的settings.xml配置文件中,做如下配置:

  1. 需要在 servers 标签中,配置访问私服的个人凭证(访问的用户名和密码)

    <server>
        <id>maven-releases</id>
        <username>admin</username>
        <password>admin</password>
    </server>
        
    <server>
        <id>maven-snapshots</id>
        <username>admin</username>
        <password>admin</password>
    </server>

  2. mirrors 中只配置我们自己私服的连接地址(如果之前配置过阿里云,需要直接替换掉)

    <mirror>
        <id>maven-public</id>
        <mirrorOf>*</mirrorOf>
        <url>http://112.128.130.121:8081/repository/maven-public/</url>
    </mirror>

  3. 需要在 profiles 中,增加如下配置,来指定snapshot快照版本的依赖,依然允许使用

    <profile>
        <id>allow-snapshots</id>
            <activation>
              <activeByDefault>true</activeByDefault>
            </activation>
        <repositories>
            <repository>
                <id>maven-public</id>
                <url>http://112.128.130.121:8081/repository/maven-public/</url>
                <releases>
                  <enabled>true</enabled>
                </releases>
                <snapshots>
                  <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
    </profile>

  4. 如果需要上传自己的项目到私服上,需要在项目的pom.xml文件中,增加如下配置,来配置项目发布的地址(也就是私服的地址)

    <distributionManagement>
        <!-- release版本的发布地址 -->
        <repository>
            <id>maven-releases</id>
            <url>http://192.168.150.101:8081/repository/maven-releases/</url>
        </repository>
        
        <!-- snapshot版本的发布地址 -->
        <snapshotRepository>
            <id>maven-snapshots</id>
            <url>http://192.168.150.101:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

  5. 发布项目,直接运行 deploy 生命周期即可 (发布时,建议跳过单元测试)

启动本地私服

  1. 解压: apache-maven-nexus.zip

  2. 进入目录: apache-maven-nexus\nexus-3.39.0-01\bin

  3. 启动服务:双击 start.bat

  4. 访问服务:localhost:8081

  5. 私服配置说明:将上述配置私服信息的 192.168.150.101 改为 localhost

总结

Maven作为一个强大的构建工具,提供了丰富的功能来帮助管理和构建大型项目。通过合理使用父工程、版本管理、聚合构建和私服配置,可以有效地简化多模块项目的管理,提高开发效率。希望本文提供的高级Maven用法和解决方案能帮助你更好地应对项目中的各种挑战。如果你有更多问题或想法,欢迎在评论区讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在ISIS中什么是IP从地址

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

win11安装python及pycharm与webots联合仿真

1、查看Windows系统 是否已安装Python及版本 【冰糖Python】Windows系统 查看已安装的Python版本_怎么确定windows上成功安装python-CSDN博客 好&#xff0c;确认没装下面装python37 2、安装python3.7.9 参考教程Python 3.82安装教程&#xff08;Windows11、超详细版&#x…

Linux Shell 编程基础入门(一)

&#x1f600;前言 本篇博文是关于自动化工具Shell 编程的基本介绍&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动…

微服务:配置管理和配置热更新

参考&#xff1a;黑马程序员之微服务 &#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、引言 二、配置共享 1. 添加共享配置到nacos &#xff08;1&#xff09;jdbc的共享配置 shared…

点灯案例优化(三)宏定义特定位名称

前面利用位运算对代码进行二次优化以后&#xff0c;确实可读性更好&#xff0c;精确性更高了。但是吧&#xff0c;你乍一看这个代码 你可能一下都反应不过来这些的啥意思了&#xff0c;表达式右边上来就是一顿运算&#xff0c;可能刚开始大多数人都看不懂这写的什么&#xff0c…

用Python解决优化问题_模拟退火模板

一、模拟退火算法简介 模拟退火&#xff08;Simulated Annealing&#xff09;是一种启发式算法&#xff0c;用于在优化问题中找到一个好的解。启发式是指一种用于找到解决问题方法的原则或策略&#xff0c;它不保证找到最优解&#xff0c;但可以快速找到一个足够好的解。在许多…

资产全生命周期管理系统 固定资产全生命周期管理解决方案

什么是资产全生命周期管理系统 资产全生命周期管理系统是指对企业资产从采购、使用、维护、到报废的整个过程进行全方位管理的软件系统。通过这个系统&#xff0c;企业可以实现对资产的实时监控和管理&#xff0c;确保资产的利用率最大化。这个系统不仅能够跟踪资产的状态&…

C语言 数据存储

整形在内存中的存储&#xff08;之前的操作符讲过些许但不是很全&#xff0c;现在详细记录&#xff09; 对于一个整型变量来说&#xff0c;在内存中需要怎样存储&#xff1f; 之前了解到内存中存放的是补码&#xff08;正数的原反补都相同。回忆一下负数原码&#xff0c;反码…

IPD开发流程:项目风险画像

目录 1、内容简介 2、IPD 工具&#xff1a;项目风险画像 首先是独特性。 第二个是不确定性。 第三个是临时性。 第四个是跨职能性。 最后一个是变革性。 作者简介 1、内容简介 在 IPD 开发流程中&#xff0c; 经常会提到开发是一项投资行为、 产品/项目的商业价值等…

精细化管理和智慧化运营的智慧油站开源了

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…

【数据分享】2018-2023年全国范围10米分辨率的耕地利用强度数据(免费获取)

耕地利用强度数据是评估农业生产力、规划土地使用、监测粮食安全与环境可持续性的关键&#xff0c;对政策制定和资源管理具有重要指导意义。然而&#xff0c;目前国家范围的耕地利用数据集在时空连续性、分辨率和精度方面存在局限性。 本次我们分享的是2018年至2023年分辨率为…

Rocky 8.10安装流程步骤详细教程

Rocky 8.10安装流程步骤详细教程 1. Rocky 8.10 安装2. 登录3. 配置修改3.1 打开命令行窗口3.2 网卡配置3.3 修改网卡名3.4 配置镜像源3.5 删除网卡多余内容3.5.1 删除virbr03.5.2 删除altname enp3s03.5.3 删除ipv63.5.4 修改ip地址(这步没有需要可以忽略) 3.6 升级openssh3.7…

【文献阅读】Lorentzian Linear Graph Convolutional Networks For Node Classification

Abstract 大多数现有的线性GCN模型在欧几里得空间中执行神经网络操作&#xff0c;并未明确捕捉到真实世界数据集中以图形式建模的树状层次结构。本文尝试将双曲空间引入线性GCN&#xff0c;并提出了一种新的洛伦兹线性GCN框架。 具体而言&#xff0c;将图节点的学习特征映射到…

函数作为返回值

复习闭包时注意到的 function lazy_sum(arr) {let sum function () {return arr.reduce(function (x, y) {return x y;});}return sum; }当我们调用lazy_sum()时&#xff0c;返回的并不是求和结果&#xff0c;而是求和函数&#xff1a; let f lazy_sum([1, 2, 3, 4, 5]); …

uniapp在线视频监控开发

我这里是uniapp开发的H5项目 视频流是flv模式 用到的插件是flv.js Flv.js Flv.js 是 HTML5 Flash 视频&#xff08;FLV&#xff09;播放器&#xff0c;纯原生 JavaScript 开发&#xff0c;没有用到 Flash。。由 bilibili 网站开源。 常见直播协议 RTMP: 底层基于TCP&…

【WebSocket】websocket学习【一】

1.消息推送常见方式 轮询长轮询SSEwebsocket 1.1. 轮询方式 轮询&#xff1a;浏览器以指定的时间间隔向服务器发出HTTP请求&#xff0c;服务器实时返回数据给浏览器长轮询&#xff1a;浏览器发出HTTP请求&#xff0c;服务器端接收到请求后&#xff0c;会阻塞请求直到有数据或…

[003].第4节:RabbitMQ环境搭建

我的后端学习大纲 RabbitMQ学习大纲 1.rpm包方式搭建&#xff1a; 1.1.搭建RabbitMQ单体架构&#xff1a; 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下&#xff1a; 3.安装MQ需要先有Erlang语言环境&#xff0c;安装文件的Linux命令(分别按照以下顺序安装…

RabbitMQ发布订阅模式Publish/Subscribe详解

订阅模式Publish/Subscribe 基于API的方式1.使用AmqpAdmin定制消息发送组件2.消息发送者发送消息3.消息消费者接收消息 基于配置类的方式基于注解的方式总结 SpringBoot整合RabbitMQ中间件实现消息服务&#xff0c;主要围绕3个部分的工作进行展开&#xff1a;定制中间件、消息发…

网络硬盘录像机NVR程序源码NVR全套运用方案

在当今社会&#xff0c;随着科技的飞速发展和人们对安全需求的日益增长&#xff0c;安防监控系统已成为保障公共安全、维护社会稳定的重要手段。其中&#xff0c;网络视频录像机&#xff08;NVR&#xff09;作为安防监控系统的核心设备&#xff0c;其智能化升级运用方案对于提高…

OpenLayers3, 加载鹰眼控件

文章目录 一、前言二、代码实现三、总结 一、前言 鹰眼图即地图显示范围的缩略图&#xff0c;可显示当前地图窗口在整幅地图中的位置。通过拖动鹰眼图对话框中的矩形框可改变当前地图的显示区域范围&#xff0c;是地图浏览中常用的功能之一。 本案例使用OpenLayers3框架&…