使用maven打生产环境可执行包

一、程序为什么要打包

程序打包的主要目的是将项目的源代码、依赖库和其他资源打包成一个可执行的文件或者部署包,方便程序的发布和部署。以下是一些打包程序的重要理由:

  1. 方便部署和分发:打包后的程序可以作为一个独立的实体,方便复制和部署到不同的环境中,包括开发、测试和生产环境。打包后的程序通常包含了所有需要的依赖和配置,并且已经做好了预处理(如编译、压缩、优化等),减少了部署和配置的复杂性。

  2. 保护源代码:打包后的程序通常会将源代码进行编译和打包,以二进制形式进行发布。这样可以保护源代码的安全性,防止他人对源代码的篡改。

  3. 管理依赖关系:在打包过程中,Maven 或其他构建工具可以自动将项目所需的依赖库打包到最终的可执行文件中。这样可以简化项目的依赖管理,减少对外部库和组件的依赖,提高了项目的独立性和可移植性。

二,使用maven打包java程序

maven内置很多插件,可以非常方便打包。

2.1使用maven-resources-plugin管理资源

maven-resources-plugin插件负责复制过滤资源文件到制定目录。程序项目的配置可分为两种,一种是静态配置,用于程序内部,即使重复部署也无需改动,比如log4j,定时任务配置quartz等。另外一种是动态配置,用于运维部署动态调整的。

2.1.1maven处理静态资源

maven对于静态资源,一般无需额外处理。我们可以把静态资源放置在maven项目的src/main/resources目录。程序打包的时候就会默认处理。

2.1.2maven处理动态资源

对于动态资源,我们一般会在程序源代码的同级目录新增一个文件夹,例如叫做config,用来放置所有的动态资源。典型的动态有数据库配置jdbc,socket配置等等。如果同样一份代码,需要在很多机器部署,例如,游戏服务器往往有好几千个游戏区,每个游戏区的代码都是一样的,只是动态资源不一样。运维在部署的时候,只需要修改动态配置。还可以使用诸如ansible之类自动化运维工具,做到一键部署全部服务器。

例如jforgame,把动态资源放置在config文件,如下所示:

maven-resources-plugin插件配置,把config配置全部拷贝到jar包输出目录。

 <plugin><artifactId>maven-resources-plugin</artifactId><version>2.6</version><executions><execution><!-- 配置文件要跟jar包在同一个目录 --><id>copy-config</id><phase>package</phase><goals><goal>copy-resources</goal></goals><configuration><outputDirectory>${project.build.directory}/configs</outputDirectory><resources><resource><directory>configs/</directory></resource></resources></configuration></execution></executions></plugin>

2.2使用maven-dependency-plugin复制依赖

程序在部署的时候一般采用“瘦客户端”模式,可执行包内部只包含业务代码,不包含第三方依赖。这样可以减小目标包的体积(第三方依赖一般不变,只在初次部署使用),加快启动速度。

            <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-jars</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/libs</outputDirectory></configuration></execution></executions></plugin>

2.3使用maven-jar-plugin打可执行包

前面两个插件都是处理资源的,这个插件才是真正将代码进行打包的,我们先来通过配置进行说明。

  <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.1.0</version><configuration><archive><manifestEntries><Class-Path>configs/</Class-Path></manifestEntries><manifest><addClasspath>true</addClasspath><classpathPrefix>libs/</classpathPrefix><mainClass>jforgame.demo.ServerStartup</mainClass></manifest></archive></configuration></plugin>

<mainClass>作用:申明jar包启动类

<Class-Path>作用:把自定义的config动态配置文件夹添加到MANIFEST.MF的Class-Path标签。

<addClasspath>+<classpathPrefix>作用:把maven-dependency-plugin引入的libs下所有第三方依赖统一添加到MANIFEST.MF的Class-Path标签。相关配置放在MANIFEST.MF文件(用rar程序打开目标包)。

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

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

相关文章

leetCode刷题 13. 罗马数字转整数

目录 题目&#xff1a; 1. 思路 2. 解题方法 3. 复杂度 4. Code 题目&#xff1a; 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L …

Vmware虚拟机使用过程中断电后无法重启处理

背景 今天在用新装的虚拟机进行测试的过程中&#xff0c;忽然笔记本关机了&#xff08;没插电源线&#xff09;&#xff0c;重启电脑后发现虚拟机提示“正在使用中“&#xff0c;具体如下所示&#xff1a; 解决 在相关虚拟机文件夹内查找以 .lck 结尾的文件&#xff0c;名称一…

java中Volatile关键字的原理

Volitile的主要作用就是保持内存可见性和防止指令重排序。我分别说一下这两个作用的实现原理 1.保持内存可见性的实现原理 volatile内存可见性主要通过lock前缀指令实现的&#xff0c;它会锁定当前内存区域的缓存&#xff0c;并且立即将当前缓存的数据写入到主内存&#xff0…

记录dockers中Ubuntu安装python3.11

参考&#xff1a; docker-ubuntu 安装python3.8,pip3_dockerfile ubuntu22 python3.8-CSDN博客

解释“RNN encode-decode”

“RNN encode-decode” 涉及使用循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;来执行编码和解码操作。这种结构常用于处理序列数据&#xff0c;例如自然语言处理、语音识别和时间序列预测等任务。 以下是 “RNN encode-decode” 的一般概念&a…

西门子PLC常用底层逻辑块分享_单/双输出电磁阀

文章目录 前言一、功能概述二、单输出电磁阀程序编写1.创建自定义数据类型2.创建FB功能块“单输出电磁阀”3.编写程序 三、双输出电磁阀程序编写1.创建自定义数据类型2.创建FB功能块“双输出电磁阀”3.编写程序 前言 本文分享一个自己编写的电磁阀控制逻辑块。 一、功能概述 …

【代码随想录】【二叉树】补day21:二叉搜索树的最小绝对差 、二叉搜索树中的众数 、二叉树的最近公共祖先

最小绝对差 1.申请一个数组&#xff0c;比较两两之间最小的差值 def getresult3(self,node:TreeNode):self.nums[]self.getMinimumDifference(node)mindifferencefloat(inf)for i in range(len(self.nums)-1):mindself.nums[i1]-self.nums[i]if mindifference>mind:mindiff…

流程控制 JAVA语言基础

任何简单或复杂的算法都可以由三种基本结构组成&#xff1a;顺序结构&#xff0c;选择结构&#xff0c;循环结构。 顺序结构 比较一般的结构&#xff0c;程序从上到下执行。 选择结构 我们从最简单的单路选择开始&#xff0c;符合条件的进入语句序列&#xff0c;不符合条件的…

【C++map和set容器:AVL树、红黑树详解并封装实现map和set】

[本节目标] map和set底层结构 AVL树 红黑树 红黑树模拟实现STL中的map和set 1.底层结构 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;在其文档介绍中发现&#xff0c;这几个容器有个 共同点是&#xff1a;其底层都是按照二叉搜索树来实现的&#xff0c;但…

高并发缓存策略大揭秘:面试必备的缓存更新模式解析

在高并发场景中&#xff0c;缓存能抵挡大量数据库查询&#xff0c;减少数据库压力&#xff0c;对于缓存更新通常有以下几种模式可以选择&#xff1a; cache asideread/write throughwrite behind caching cache aside模式 Cache-aside模式是一种常用的用于管理缓存的模式。它…

RocketMQ学习笔记四(黑马)

课程地址&#xff1a; 1.Rocket第二章内容介绍_哔哩哔哩_bilibili &#xff08;视频35~88&#xff0c;搭建了一个电商项目&#xff09; 待学&#xff0c;待完善。

瑞_23种设计模式_策略模式

文章目录 1 策略模式&#xff08;Strategy Pattern&#xff09;★1.1 介绍1.2 概述1.3 策略模式的结构1.4 策略模式的优缺点1.5 策略模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析&#xff08;Comparator&#xff09; &#x1f64a…

mysql中用逗号隔开的某字段,如何判断其他表的字段值是否在这个字段中

因为要增加需求&#xff0c;需要将线上表中老数据&#xff0c;修改为新数据的规则。 线上两张表&#xff0c;sequence_number中is_use有3作废、2到期状态&#xff0c;需要根据这个状态和school_ai_authorization中的is_deleted修改新增的state字段。 sequence_number表结构&…

温暖如初春:新生儿脸红小贴士

引言&#xff1a; 新生儿脸红是许多父母热切期待的瞬间之一。这种可爱的现象不仅令人陶醉&#xff0c;还可能是宝宝良好健康的标志。然而&#xff0c;在欣喜之余&#xff0c;父母也需要留意脸红背后的可能原因和注意事项&#xff0c;以确保宝宝的舒适和健康。 1. 探寻原因&…

通天星CMSV6 车载视频监控平台 信息泄露漏洞

漏洞描述 通天星CMSV6车载视频监控平台 StandardLoginAction getAlser.acion接口处存在信息泄露漏洞 fofa语句 body"/808gps/" 漏洞复现 打开页面 构造payload POST /808gps/StandardLoginAction_getAllUser.action HTTP/1.1 Host: User-Agent: Mozilla/5.0 (…

ASP.NET区域检验云LIS平台源码 标本全生命周期管理

目录 一、云LIS系统功能亮点 二、收费项目管理 三、检验项目管理 系统功能 云LIS系统源码是一款全面的实验室信息管理系统源码&#xff0c;其主要功能包括样本管理、检测项目管理、质控管理、报告管理、数据分析、两癌筛查等多个方面。具有独立的配套SaaS模式运维管理系统&…

轻量级内网穿透服务-nps

1. NPS概述&#xff1a; NPS&#xff08;内网穿透代理服务器&#xff09;是一款由TalentYoung开发的轻量级、高性能的内网穿透代理服务器。它的设计目标是简单易用、功能强大&#xff0c;可以帮助用户在公网上访问内网服务。 NPS支持TCP、UDP、HTTP等多种协议&#xff0c;并提…

翻转时钟效果

时分秒三个部分结构功能完全一致&#xff0c;均有四块构成&#xff0c;上下各两块。 正面可见&#xff0c;背面不可见&#xff0c;同时需要调整翻转过程中的z-index。 初始状态card2为已经翻转状态。 calendar.html <!DOCTYPE html> <html lang"en">&…

非常有用的Python 20个单行代码

有用的 Python 单行代码片段&#xff0c;只需一行代码即可解决特定编码问题&#xff01; 在本文中&#xff0c;云朵君将分享20 个 Python 一行代码&#xff0c;你可以在 30 秒或更短的时间内轻松学习它们。这种单行代码将节省你的时间&#xff0c;并使你的代码看起来更干净且易…

H5 带网站测速引导页源码

源码名称&#xff1a;带网站测速引导页源码 源码介绍&#xff1a;一款带网站测速功能的引导页源码 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/10717.html