Maven相关知识

news2024/11/17 7:34:06

maven 继承与聚合

聚合:聚合多个模块(可以一起构建) ,各模块之间单独打包
继承: 为了消除重复,将相同的配置提取,子模块默认继承全部父模块的依赖dependencies节点,通过它来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号

  • 聚合只需要在 父模块 中指定module既可以
<modules>
   <module>模块一</module>
   <module>模块二</module>
   <module>模块三</module>
</modules>

  • 继承除了要在父模块中指定modules外,还需要在子模块中指定parent
<parent>  
   <groupId>me.gacl.maven</groupId>
   <artifactId>ParentProject</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <relativePath>../ParentProject/pom.xml</relativePath>  
</parent>

Maven中dependencies节点和dependencyManagement节点的区别

一个是项目依赖,一个是多模块maven项目时候的依赖管理控制的.
dependencyManagement一般存在在顶层pom文件中
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

<dependencyManagement>
    <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>    
    <dependency>
            <groupId>cn.itcast.maven</groupId>
            <artifactId>HelloFriend</artifactId>
            <version>${maven.version}</version>
            <type>jar</type>
            <scope>compile</scope>
       </dependency>
     </dependencies>
</dependencyManagement>

dependencyManagement的好处是子模块可以有选择行的继承,而不需要全部继承。
注意:dependencyManagement只是进行版本的管理,可以让子模块有选择的进行依赖

dependency元素

dependency中除了可以指定依赖项目的groupId、artifactId和version之外,还可以指定以下元素:

  • type:对应于依赖项目的packaging类型,默认是jar

  • scope:表示依赖项目的一个作用范围。scope的主要取值范围如下(还有一个是在Maven2.0.9以后版本才支持的import,关于import作用域将在后文《Dependency介绍》中做介绍):

    • compile:这是它的默认值,这种类型很容易让人产生误解,以为只有在编译的时候才是需要的,其实这种类型表示所有的情况都是有用的,包括编译和运行时。而且这种类型的依赖性是可以传递的。

    • provided:这个跟compile很类似,但是它表示你期望这个依赖项目在运行时由JDK或者容器来提供。这种类型表示该依赖只有在测试和编译的情况下才有效,在运行时将由JDK或者容器提供。这种类型的依赖性是不可传递的。

    • runtime:这种类型表示该依赖在编译的时候不是必须的,只有在运行的时候才是必须的。

    • test:这表示这种依赖只有测试的时候才需要,正常情况下是不需要的。

    • system:这种类型跟provided类似,唯一不同的就是这种类型的依赖我们要自己提供jar包,这需要与另一个元素systemPath来结合使用。systemPath将指向我们系统上的jar包的路径,而且必须是给定的绝对路径。

  • systemPath:上面已经说过了这个元素是在scope的值为system的时候用于指定依赖的jar包在系统上的位置的,而且是绝对路径。该元素必须在依赖的 jar包的scope为system时才能使用,否则Maven将报错。

  • optional:当该项目本身作为其他项目的一个依赖时标记该依赖为可选项。假设现在projectA有一个依赖性projectB,我们把projectB这个依赖项设为optional,这表示projectB在projectA的运行时不一定会用到。这个时候如果我们有另一个项目projectC,它依赖于projectA,那么这个时候因为projectB对于projectA是可选的,所以Maven在建立projectC的时候就不会安装projectB,这个时候如果projectC确实需要使用到projectB,那么它就可以定义自己对projectB的依赖。当一个依赖是可选的时候,我们把optional元素的值设为true,否则就不设置optional元素。

  • exclusions:考虑这样一种情况,我们的projectA依赖于projectB,然后projectB又依赖于projectC,但是在projectA里面我们不需要projectB依赖的projectC,那么这个时候我们就可以在依赖projectB的时候使用exclusions元素下面的exclusion排除projectC。


maven 打包

当项目要上线,部署到服务器上去的时候或许会碰见这样的问题。问题就是,服务器上没有maven的环境,也就是说,项目所依赖到的那些仓库(repository)中的jar包你需要单独提取出来上传到服务器中去。

maven 在进行打包(mvn package)时,会根据< packaging >来判断是打成何种包:
war包:能自动将项目依赖的jar包打到web-inf下的lib文件夹中。
jar包:执行过程中不会将依赖的第三方包提取出来。

<groupId>com.sankuai.peisong.data</groupId>
<artifactId>waybill_dispatch_dw</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar or war</packaging>

maven assembly插件

maven在打包的时候,如果是对jar包进行打包,是不会将依赖的第三方包提取出来,发布项目只发布这个打包好的jar包,会提示找不到第三方依赖包中类的定义。之前看到有人在项目要上线的时候将pom类型改成war,然后执行一下mvn package命令,这样先把所以依赖到的包提取出来,然后再把pom类型改成jar,这样虽然能完成任务,但是,总感觉这样的做法比较拙劣。
其实,完全可以通过使用maven自带的assembly插件来完成 先打war包,然后再改为jar的过程。

1.在pom文件中指定assembly插件

<plugins>
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <descriptors>
                <descriptor>assembly.xml</descriptor>
            </descriptors>
        </configuration>
    </plugin>
<plugins>

2.开发assembly.xml文件

<assembly>
<id>spark-online</id>
<formats>
    <format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
    <dependencySet>
        <unpack>true</unpack>
    </dependencySet>
</dependencySets>
</assembly>

unpack元素指定为true,则会将所有的代码打包到指定的jar包中
image.png

注意这会将所有的包都unpack到目标jar包里(即该jar包包含所有的代码)

unpack元素指定为false,则会对各个第三方依赖分别打到jar包中
image.png

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

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

相关文章

汽车IVI中控开发入门及进阶(三十一):视频知识扫盲

有效的视频资源管理需要集成许多不同的底层技术,共同为用户提供给定应用程序的最佳体验。其中许多技术是从早期电视广播中使用的技术演变而来的。其他方法,如用于通过网络流式传输视频的压缩方法,相对较新且不断发展。 以下详细概述了与图形和视频处理和传输相关的一些基本…

智能合约开发的过程

智能合约是一种运行在区块链上的程序&#xff0c;可以自动执行预先设定的条款和条件。智能合约具有去中心化、透明、不可篡改等特点&#xff0c;因此被广泛应用于金融、供应链、物联网等领域。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

西门子PLC1200--与电脑连接的TCP通讯

本例演示将PLC作为服务器&#xff0c;电脑作为客户端&#xff0c;进行通讯。 反过来也是一回事&#xff0c;就不啰嗦了。 二者进行TCP通讯&#xff0c;是基于网线的&#xff0c;电脑上用的是网口&#xff0c;PLC上用的是Profinet接口&#xff0c;即PN口。 软件工具准备 西门子…

智慧工地系统源码,支持项目级、公司级、集团级多级权限划分,支持PC端、手机端

智慧工地的核心是数字化&#xff0c;它通过传感器、监控设备、智能终端等技术手段&#xff0c;实现对工地各个环节的实时数据采集和传输&#xff0c;如环境温度、湿度、噪音等数据信息&#xff0c;将数据汇集到云端进行处理和分析&#xff0c;生成各种报表、图表和预警信息&…

2023-2024“讯方杯”全国总决赛即将开赛,精彩一触即发!

讯方杯 2023-2024“讯方杯”全国大学生信息技术应用及创新大赛全国总决赛将于2024年6月21日一23日在广东东莞举行&#xff0c;旨在为全国高校大学生打造竞技和交流平台&#xff0c;提升学生的ICT知识水平和实践动手能力&#xff0c;助力学生迈向更高的竞赛舞台。 本次大赛由深…

24年新版!这份Excel+Python飞速搞定数据分析手册,简直可以让Excel飞起来

前⾔ 微软在 UserVoice 上运营着⼀个反馈论坛&#xff0c;每个⼈都可以在这⾥提交新点⼦供他⼈投票。票数最⾼的功能请求是“将 Python 作为Excel 的⼀门脚本语⾔”&#xff0c;其得票数差不多是第⼆名的两倍。尽管⾃2015 年这个点⼦发布以来并没有什么实质性进展&#xff0c;…

从零基础到学完CCIE要多久?

思科认证的CCIE是网络工程师追求的顶级认证之一。 对于刚入门的初学者来说&#xff0c;从零基础到通过CCIE认证&#xff0c;这条路需要多长时间&#xff1f; 这个问题的答案因人而异&#xff0c;取决于多种因素。 这不仅是一个关于时间的问题&#xff0c;更是一个关于规划、学习…

oracle数据库日常保养或巡检语句实践整理汇总

目录 1.目的 2.操作工具 3.实践说明 1.检查Oracle实例状态 2.检查Oracle在线日志状态 3.检查Oracle表空间状态 4.检查Oracle所有数据文件状态 5.检查Oracle数据库连接情况 6.检查Oracle表容量占用大小 7.检查Oracle备份 8.检查数据库表空间的使用情况 4.总结 1.目的 …

无线麦克风哪个品牌音质最好,领夹麦克风品牌排行榜前十名推荐

​在数字化时代的背景下&#xff0c;声音的传播与记录变得日益重要。无论是会议室、教室还是户外场所&#xff0c;无线领夹麦克风凭借其便携性和稳定的连接性能&#xff0c;成为人们沟通表达的首选工具。面对众多选择&#xff0c;我为你精选了几款性能卓越且性价比高的无线领夹…

ShokoServer /api/Image/withpath/ 任意文件读取漏洞复现(CVE-2023-43662)

0x01 产品简介 ShokoServer是一款高性能、可扩展的服务器软件&#xff0c;专为满足现代数据管理和处理需求而设计。它采用先进的架构和算法&#xff0c;提供稳定、可靠的数据存储、查询和分析服务&#xff0c;适用于各种规模和类型的应用场景。 0x02 漏洞概述 ShokoServer /…

AI 代理可以改变 B2B 电子商务的业务动态

今天你听到的都是人工智能&#xff0c;这是有原因的。在过去 18 个月里&#xff0c;我们经历了比以往更多的人工智能创新。人工智能一夜之间走出了实验室&#xff0c;并成为可行的商业驱动力。 一个有望赢得巨大胜利的行业是 B2B电子商务。事实上&#xff0c;B2B 电子商务可以…

C语言学习之路(黑马)

文章目录 环境搭建HelloWorld代码编写代码分析执行流程 核心语法注释单行注释多行注释注释示例 关键字常量变量计算机进制数据类型标识符键盘录入 运算符算术运算符比较运算符赋值运算符自增减运算符逻辑运算符三元运算符逗号运算符运算符的优先级 流程控制语句顺序结构分支结构…

计算机缺失msvcr110.dll如何解决,教你几种靠谱的解决方法

计算机丢失msvcr110.dll文件是一种常见的电脑问题&#xff0c;但可能导致一些软件无法运行。 一&#xff0c;关于msvcr110.dll文件的概述 msvcr110.dll 是 Microsoft Visual C 2012 Redistributable 的一个组件&#xff0c;它是一个动态链接库文件&#xff0c;对于使用 Visual…

【案例分析】一文讲清楚SaaS产品运营的六大杠杆是什么?具体怎么运用?

在SaaS&#xff08;软件即服务&#xff09;行业&#xff0c;如何快速获取用户并实现持续增长一直是企业关注的重点。近年来&#xff0c;分销裂变策略因其高效性和低成本特性&#xff0c;成为许多SaaS企业实现快速增长的秘诀。下面&#xff0c;我们将通过一个具体的案例来剖析成…

【计算机视觉(11)】

基于Python的OpenCV基础入门——图像梯度变换 图像梯度变换Sobel算子Scharr算子Laplacian算子 图像梯度变换的代码实现以及效果图 图像梯度变换 图像梯度变换可以用于边缘检测、特征提取、增强图像和压缩图像等多种任务。图图像梯度可以把图像看成二维离散函数&#xff0c;图像…

帝国CMS二次开发H5手游如何让同一个url 不同的模板

帝国CMS在二次开发《72游戏网》的时候&#xff0c;H5手游如何让同一个url 不同的模板 比如&#xff1a;www.72yy.com/you/11935.html 是H5游戏宣传页 由于很多H5游戏和网页游戏都是需要使用iframe来嵌套使用的 利于自己网站SEO收录优化 那么就再复制一套程序 用二级目录或者二…

vue3 页面左右滑动钩子封装

// useSwiper.js文件 import { ref, onMounted, onUnmounted } from "vue"; export function useSwiper({tabList, //tab数据curTabId,// 当前tab idcurTabIndex,// 当前tab 索引tabChange,// tab改变事件animation,// 动画animationData,// 动画 }) {let minOffset …

具备人工智能标记的书签应用Hoarder

什么是 Hoarder &#xff1f; Hoarder 是一款可自托管的书签应用程序&#xff08;链接、笔记和图像&#xff09;&#xff0c;具有基于人工智能的自动标记和全文搜索功能。适合数据囤积者使用。 软件特点&#xff1a; &#x1f517; 为链接添加书签、做简单的笔记并存储图像。⬇…

Redis学习|Redis 是什么、Redis 能干嘛、Window安装Redis、Linux下安装Redis、Redis测试性能

Redis 是什么? Redis(Remote Dictionary Server)&#xff0c;即远程字典服务! 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API. redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记…

DLP数据防泄密系统有什么功能?四款特别好用的DLP仿泄密系统

DLP&#xff08;Data Loss Prevention&#xff0c;数据丢失防护&#xff09;系统是一类专门用于保护组织内部数据不被非法访问、泄露或误用的安全解决方案。 这类系统通常具备以下关键功能&#xff1a; 1.数据识别与分类&#xff1a;自动发现并分类存储在网络、终端和云环境中…