MAVEN打包这一篇就够了

news2024/9/21 20:29:28

Maven打包说明

IDEA目录结构

Java代码从编码到最后运行到两个核心步骤为"编译"和"执行"。"编译"会根据"源代码"产出对应的".class"文件,而"执行"就是让程序运行起来,运行的对象就是这些".class"文件。

那么,“源代码”也好,“.class”文件也好被放到了哪里呢?目录结构是怎样的呢?

  • 如图所示:“quark-net”是一个module的根目录,也就是工程目录。

  • “quark-net”的下一级有两个目录,一个是“src”,一个是“target”。简单的理解,“src”就是常规的“源代码”存在的最上级目录,而“target”就是“编译”后生成的文件位置的最上级目录。

  • “src”的下一级也有两个目录,一个是“main”,一个是“test”。简单的理解,“main”内是项目正式文件,而“test”内是项目测试文件。

  • “src/main”的下一级也有两个目录,一个是“java”,一个是“resources”。简单理解,“java”内就是项目源代码,而“resources”内是程序运行所需要的资源文件(一般以配置文件居多)。

  • “target”内部需要关注的就是“classes”目录,“src/main”内的文件编译后就是到“target/classes”内。

MAVEN打包

默认打包思路

mvn clean install

  • 以上命令为默认MAVEN打包的命令

  • 使用该命令打包时,项目工程也会先被“编译”,“target/classes”下会有重新编译的内容。包括源代码编译后的“.class”文件,以及resources目录下的资源文件。

  • “编译”完成后,就会打包。所有“target/classes”下的内容会被打进最后形成的JAR包内(这也证明了JAVA程序的特点,一次编译,多处运行。因为JAR包内的文件已经是“编译”后的内容)。

定制打包思路

这个用到了插件,需要先理解下述的配置以及原理

mvn clean package assembly:single

默认打包方式,最后会把“target/classes”内的所有文件放到JAR包内,包括resources下的文件。思考这样一个问题,如果resources里面有项目启动时的配置文件,那么如果我们在运行jar包的时候,想修改配置文件内的内容怎么办呢?按照默认打包方式,我们需要先修改配置文件,然后再重新打包,这样每一次对配置文件的修改,都依附于一次重新打包。此时,就需要有一种方法来支持所谓的“配置文件外置”的需求。

  1. 定制“编译”

“编译”的时候会把“src/main”内的文件编译后放到“target/classes”下,打包会把“target/classes”下的文件放进JAR包。既然如此,想要实现“配置文件外置”的需求,就要找一种方式,让“src/main/resources”下的文件不被编译进“target/classes”下就可以了,这就需要用到项目pom文件中的“resource”标签了。

  • 在pom文件中增加上述配置即可自定义指定编译后文件的存放位置。

  • 上述配置之后,“src/main/resources”下的文件会被放到“target/resources”目录下。

  • 此时再打包时,“target/classes”下就不会有“src/main/resources”的内容,那么对应的JAR包内也不会有这部分文件了。

  • 此处只是用一个例子作为介绍,实际上理解了本质,pom中的该标签可以根据需求做出很多配置。此处不对该标签做过多的介绍,但其实际功能远不止此。

  1. 定制“打包”

经过上述定制“编译”后,如果使用maven打包,JAR包内是不会有配置文件的(src/main/resources下的文件都不会有)。虽然解决了这个问题,但是此时直接执行JAR包,肯定无法运行,因为JAR包内没有了配置文件,那么程序也就找不到配置文件了。所以,需要一种方式,告诉JAR包,配置文件去哪里读取。这里,介绍使用MAVEN插件的方式,指定配置文件。

  • pom文件增加上述插件的配置,如图所标识的配置,就是告诉JAR包,你执行的时候去这个路径下读取配置文件,这个路径是相对于JAR包位置的路径。例子中配置的就是JAR包同级目录下的resources文件夹下去读配置文件。

  • 该插件的其他配置可以参考注释,此处不做过多解释,只需要知道标注的位置告诉了JAR包读取配置文件的路径即可。

  1. 形成“压缩包”

有了定制编译后,我们分离了JAR包和配置文件。有了定制打包后,我们告诉了JAR包读取外置配置文件的路径。思考一个问题,难道每次我们都要手动拷贝src/main/resources内的文件,然后放到JAR包同目录下的位置(也可以配置其他位置,此处以上述例子中的配置做介绍)吗?此时我们可以在打包的时候除了形成JAR包,同时也将其他我们想要的内容也进行打包,最后将这全部的内容全部打进一个整体的包内。此处还是介绍一种MAVEN插件的形式。

  • 如图所示,pom中配置此插件,进行整体打包。

  • 该插件需要assembly.xml的配置文件,如图标识为改配置文件的路径。

  • 如上图所示,第一个标注为最终整体包的压缩方式,此处配置的是zip包。

  • 而第二个标注就是将“src/main/resources”里的内容打进zip包的根目录的resources目录下。

  • fileSets中的第二个fileSet的配置是将JAR包也放到zip包的根目录下。至此,JAR包和外置配置文件的相对路径就形成了。

本地读取不到配置文件问题

在进行上述的配置后,已经成功解决了“resources”资源文件外置的问题,这样只要打包一次后,每次运行的时候都可以修改配置文件,并且让修改后的配置文件生效了。但是,如果你真的这么配置了,当你在某些时候使用本地IDEA运行自己的工程代码的时候,会提示找不到配置文件的错误。

如果理解JAVA程序资源路径的配置这个问题就会很容易理解。如上图所示,我们程序中配置文件的路径可以直接使用相对路径,那么这个相对路径在使用ClassLoader去load的时候,其实就是target/calsses里面去找。也就是说,“.class”文件执行时候的相对位置的相对路径就是“target/classes”路径。图中直接在源代码中使用的配置文件虽然直接写的是“robot.properties”,但其实是“target/classes/robot.properties”,因为源代码编译后的路径是“target/classes”目录。

理解了JAVA程序资源路径的配置后,这个问题就会很容易理解。我们在pom中定制编译的时候重新指定了资源文件的位置,那么“target/classes”中已经没有了资源文件,自然就找不到了。

一种简单的解决方式,就是程序中写的路径,需要指定为pom中定制编译时重新指定的路径。另一种简单的方式是,每次本地IDEA编译执行的时候,将pom中<resource>标签注释掉,打包的时候再启用。无论是哪种方式都不太理想,这里提供一种新的思路。

该思路为,定制编译的时候还是将src/main/resources下的内容编译进target/classes中,这样保证了本地执行的时候可以找到配置文件。然后插件配置的时候使用includes标签,只将.class文件打进jar包,这样依然保证了JAR包内不会打进资源文件,然后资源文件仍旧是使用插件打进zip包内配置的相对路径下即可!

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

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

相关文章

【C语言学习笔记】:动态库

一、动态库 通过之前静态库那篇文章的介绍。发现静态库更容易使用和理解&#xff0c;也达到了代码复用的目的&#xff0c;那为什么还需要动态库呢&#xff1f; 1、为什么还需要动态库&#xff1f; 为什么需要动态库&#xff0c;其实也是静态库的特点导致。 ▶ 空间浪费是静…

怎么打造WhatsApp Team?SaleSmartly(ss客服)告诉你

关键词&#xff1a;WhatsApp Team SaleSmartly&#xff08;ss客服&#xff09; 您是否正在寻找一种让您的团队能够在 WhatsApp协作消息传递的解决方案?拥有了 WhatsApp Team&#xff0c;不仅效率提升&#xff0c;还可以在智能聊天工具中比如SaleSmartly&#xff08;ss客服&…

51单片机——中断系统,小白讲解,相互学习

中断介绍 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#xff0c;很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一&#xff0c;是我们学些单片机必须要掌握的。 为了更容易的理解中断概念&…

算法思想 - 动态规划算法

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中&#xff0c;可能会有许多可行解。每一个解都对应于一个值&#xff0c;我们希望找到具有最优值的解。动态规划算法与分治法类似&#xff0c;其基本思想也是将待求解问题分解成若干个子问题&#xff0c;先求解子问…

哈希表题目:判断路径是否相交

文章目录题目标题和出处难度题目描述要求示例数据范围解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析题目 标题和出处 标题&#xff1a;判断路径是否相交 出处&#xff1a;1496. 判断路径是否相交 难度 3 级 题目描述 要求 给你一个字符串 path\texttt…

【软考系统架构设计师】2022下案例分析历年真题

【软考系统架构设计师】2022下案例分析历年真题 【软考系统架构设计师】2022下案例分析历年真题【软考系统架构设计师】2022下案例分析历年真题2022下案例分析历年真题第一题&#xff08;25分&#xff09;2022下案例分析历年真题第二题&#xff08;25分&#xff09;2022下案例分…

使用纹理(Textures)

当物体表面并非是纯色的时候&#xff0c;比如带波点&#xff0c;斑纹或者表面有刮痕或被裂纹等&#xff0c;这些效果该如何实现呢&#xff1f; 这里我们需要提到一个概念是贴图&#xff08;Maps&#xff09;。Maps是覆盖在游戏物体上的2D图片&#xff0c;用来设置表面的颜色、s…

大数据-学习实践-1相关Linux

大数据-学习实践-1相关Linux (大数据系列) 文章目录大数据-学习实践-1相关Linux1知识点2具体内容2.1安装、使用2.2高级命令2.2.1文件2.2.2日期2.2.3进程2.2.4三剑客 (grep、sed、awk)2.3高级配置2.3.1分配IP&#xff1a;静态IP设置2.3.2起名&#xff08;hostname&#xff09;&…

工程经验:残差连接对网络训练的巨大影响

文章目录1、没有使用残差连接的网络难以训练2、loss 不下降的原因3、使用了残差连接的网络可以高效训练1、没有使用残差连接的网络难以训练 经典的 SegNet 网络结构如下&#xff1a; 在使用上图所示的 SegNet 作为噪声预测网络训练扩散模型&#xff08;DDPM&#xff09;时&…

Elasticsearch汉字补全和智能纠错使用详解

1 使用ES实现的效果 汉字补全 拼写纠错

Python自动化测试【软件测试最全教程(附笔记、学习路线)】,看完即就业

最近看到很多粉丝在后台私信我&#xff0c;叫我做一期Python自动化测试的教程&#xff0c;其实关于这个问题&#xff0c;我也早就在着手准备了&#xff0c;我录制了一整套完整的Python自动化测试的教程&#xff0c;上传到网盘里了&#xff0c;大家有兴趣的可以去文末交流群免费…

[架构之路-107]-《软考-系统架构设计师》-0-系统分析师与系统架构设计师简介与官网介绍

官网链接&#xff1a;https://www.ruankao.org.cn/index/ind计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试简介计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;以下简称计算机软件资格考试&#xff09;是原中国计算机软件专业技术…

化学试剂Glutaric Acid-PEG-Glutaric Acid,GA-PEG-GA,戊二酸-聚乙二醇-戊二酸

一&#xff1a;产品描述 1、名称 英文&#xff1a;Glutaric Acid-PEG-Glutaric Acid&#xff0c;GA-PEG-GA 中文&#xff1a;戊二酸-聚乙二醇-戊二酸 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Carboxylic acid PEG 4、分子量&#xff1a;可定制&#xff0c; 戊…

如果网站的 Cookie 特别多特别大,会发生什么(一)

有没有想过&#xff0c;如果网站的 Cookie 特别多特别大&#xff0c;会发生什么情况&#xff1f; 不多说&#xff0c;马上来试验一下&#xff1a; for (i 0; i < 20; i) document.cookie i X.repeat(2000) 什么&#xff0c;网站居然报错了&#xff1f; 众所周知&am…

【Unity VR开发】结合VRTK4.0:自身移动(滑动)

语录&#xff1a; 依山傍水房树间&#xff0c;行也安然&#xff0c;住也安然&#xff1b; 一条耕牛半顷田&#xff0c;收也凭天&#xff0c;荒也凭天&#xff1b; 雨过天晴驾小船&#xff0c;鱼在一边&#xff0c;酒在一边&#xff1b; 夜晚妻子话灯前&#xff0c;今也谈谈…

考研复试机试 | C++

目录1.盛水最多的容器<11>题目代码&#xff1a;2.整数转罗马数字题目&#xff1a;代码&#xff1a;3. 清华大学机试题 abc题目题解4.清华大学机试题 反序数题目描述代码对称平方数题目代码&#xff1a;5. 杭电上机题 叠筐题目&#xff1a;代码pass&#xff1a;关于清华大…

Windows server——部署DNS服务(3)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.管理DNS服务 1.子域 案例 2. 委派 案例 1&#xff09;添加主机记录 …

替代AG9300|替代NCS8823|CS5260 Type-C转VGA视频转换方案

替代AG9300|替代NCS8823|CS5260 Type-C转VGA视频转换方案 CS5260是一款是一款实现USB TYPE-C到VGA视频转换的单片机解决方案转换器。CS5260支持USB Type-C显示端口交替模式&#xff0c;CS5260可以将视频和音频流从USB Type-C接口传输到VGA端口。在CS5260芯片中&#xff0c;显示…

01设计模式相关理论

设计模式git代码地址 设计模式分类 创建型模式 用于描述“怎样创建对象”&#xff0c;它的主要特点是“将对象的创建与使用分离”。GoF&#xff08;四人组&#xff09;书中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。结构型模式 用于描述如何将类或对象…

SQL注入Getshell的奇思妙想(下)

前言 由于笔者发现大量的hr面试官都喜欢从SQL注入开始询问&#xff0c;所以留心了一下关于SQL注入的问题的频率。结果非常amazing啊&#xff01;不出意外的是–os- shell名列榜首。 但是啊由于我们不能被面试官所引导&#xff0c;这样太被动啦&#xff01;我们应该引导hr问我们…