使用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.rhkb.cn/news/273933.html

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

相关文章

System是什么?为什么不能直接输出null?

在看学习下面的知识前&#xff0c;得先对java核心类库有个大致的了解&#xff0c;详情可参考链接 java基本概念-扩展点-CSDN博客 1、System 1.1 System是什么&#xff1f; System是一个类&#xff0c;它包含了一些有用的属性和方法。 1.2 System实现的功能 &#xff08;1&…

openssl3.2 - 官方demo学习 - encode - ec_encode.c

文章目录 openssl3.2 - 官方demo学习 - encode - ec_encode.c概述笔记产生ecc私钥产生ecc公钥测试工程备注备注END openssl3.2 - 官方demo学习 - encode - ec_encode.c 概述 官方demos/encode 目录中给了2个例子工程 功能是载入(RSA/ECC)公钥, 然后自己就可以拿内存中的公钥对…

仿牛客网项目---消息队列的实现

本篇文章讲一讲我们的项目中用到的消息队列。 1.阻塞队列 2.kafka 我的项目为什么要用消息队列&#xff1f; 如果采用消息队列&#xff0c;那么评论、点赞、关注三类不同的事&#xff0c;可以定义三类不同的主题&#xff08;评论、点赞、关注&#xff09;&#xff0c;发生相应…

JDK环境变量配置-jre\bin、rt.jar、dt.jar、tools.jar

我们主要看下rt.jar、dt.jar、tools.jar的作用&#xff0c;rt.jar在​%JAVA_HOME%\jre\lib&#xff0c;dt.jar和tools.jar在%JAVA_HOME%\lib下。 rt.jar&#xff1a;Java基础类库&#xff0c;也就是Java doc里面看到的所有的类的class文件。 tools.jar&#xff1a;是系统用来编…

报名开启丨掘金海外,探寻泛娱乐社交APP出海新风口

随着国内泛娱乐行业用户规模趋于见顶&#xff0c;泛娱乐社交APP转向出海是必然趋势。 根据行业数据显示&#xff0c;有超过35%的国内实时社交企业已启动或者正在规划出海&#xff0c;而其中出海商户的音视频流量增长均超过了100&#xff05;。尤其是在东南亚、中东、拉美等新兴…

企业数据备份体系化方法论的七大原则:数据生命周期规划:资产管理的新篇章

在数字化浪潮中&#xff0c;数据如同新时代的石油&#xff0c;成为了推动企业前进的核心动力。但与所有宝贵资源一样&#xff0c;如果我们不能妥善管理&#xff0c;这种无形的资产就难以发挥其应有的价值。这就是为何数据生命周期规划&#xff08;DLP&#xff09;显得如此重要。…

mangoDB:2024安装

mangoDB:2024安装 mangoDB: 下载链接 取消勾选 配置环境变量 启动服务 同级目录下创建一个db文件夹 然后执行命令&#xff0c;启动服务 mongod --dbpath D:\environment\mango\db访问http://localhost:27017/ 出现下面的就是安装成功 2然后在管理员权限下给mango服务重…

研发效能DevOps: OpenEuler 部署 drone 持续集成平台

目录 一、实验 1.环境 2.OpenEuler 部署 drone 持续集成平台 二、问题 1.drone登录失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168.204.145&#xff08;动态&#xff09; 192.168.204.141&…

Linux - 安装 Jenkins(详细教程)

目录 前言一、简介二、安装前准备三、下载与安装四、配置镜像地址五、启动与关闭六、常用插件的安装 前言 虽然说网上有很多关于 Jenkins 安装的教程&#xff0c;但是大部分都不够详细&#xff0c;或者是需要搭配 docker 或者 k8s 等进行安装&#xff0c;对于新手小白而已&…

虚拟机中安装Win98

文章目录 一、下载Win98二、制作可启动光盘三、VMware中安装Win98四、Qemu中安装Win981. Qemu的安装2. 安装Win98 Win98是微软于1998年发布的16位与32位混合的操作系统&#xff0c;也是一代经典的操作系统&#xff0c;期间出现了不少经典的软件与游戏&#xff0c;还是值得怀念的…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:CalendarPicker)

日历选择器组件&#xff0c;提供下拉日历弹窗&#xff0c;可以让用户选择日期。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 CalendarPicker(options?: CalendarOptions) …

Docker-部署若依项目

文章目录 后端一、搭建局域网二、redis安装测试 三、MySQL安装四、后端项目放入位置及使用Dockerfile自定义镜像后端项目放入位置 前端配置检查各个端口是否启动nginx部署 首先得先把内部的文件给删除清空 docker images–查看有哪些文件 docker rmi -f ID–删除ID 后端 一、…

跨境账号养号怎么做?Facebook、亚马逊运营必看

之前我们讨论过很多关于代理器的问题。它们的工作原理是什么?在不同的软件中要使用那些代理服务器?这些代理服务器之间的区别是什么?什么是反检测浏览器等等。 除了这些问题&#xff0c;相信很多人也会关心在使用不同平台的时代理器的选择问题。比如&#xff0c;为什么最好…

【axios】你的进度条准确吗

1、axios监听进度 上传和下载操作在前端中是非常常见的&#xff0c;当我们想知道上传或下载的进度时也不难&#xff0c;axios已经实现了监听进度的方法 import axios from axios// 上传请求 axios.post(/api/v1/upload, {data: xxx},{// onUploadProgress回调可以获取进度onU…

提示并输入一个字符串,统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C++风格字符串完成

#include <iostream> #include <array> using namespace std;int main() {cout<<"请输入一个字符串"<<endl;//array<string,100> str;string str;getline(cin,str);int daxie0,xiaoxie0,num0,space0,other0;int lenstr.size();;for(in…

vue接入百度地图获取经纬度

通过城市名称和城市中心经纬度来获取当前所在地图&#xff0c;当前经纬度中心获取可以通过后端获取 静态文件包&#xff0c;替换baidu.html中的ak值&#xff0c;ak值通过百度地图官方网站申请 申请&#xff1a;百度地图API申请步骤 - 知乎 代码示例文件&#xff1a; 链接&a…

数组:初始化,访问某一个,遍历

文章目录 静态初始化数组数组的访问&#xff1a;遍历数组案例 动态初始化数组总结案例 静态初始化数组 定义数组的时候直接给数组赋值。 简化格式&#xff1a; int[] ages {12,52,96}; 完整格式&#xff1a; int[] ages new int[]{12,16,26};数组变量名中存储的是数组在内存…

【字典合集】SecLists-更全面的渗透测试字典 v2024.1

下路路径 SecLists-更全面的渗透测试字典 v2024.1 简介 SecLists 是一个致力于收集各种安全字典的开源项目。这些字典包括但不限于&#xff1a;密码字典、用户名字典、网络扫描结果、漏洞利用载荷、web shells、可用于渗透测试的Payloads、以及其他各种安全相关的字典。 这…

面试官:线程调用2次start会怎样?我支支吾吾没答上来

写在开头 在写完上一篇文章《Java面试必考题之线程的生命周期&#xff0c;结合源码&#xff0c;透彻讲解!》后&#xff0c;本以为这个小知识点就总结完了。 但刚刚吃晚饭时&#xff0c;突然想到了多年前自己面试时的亲身经历&#xff0c;决定再回来补充一个小知识点&#xff…

C++写食堂菜品管理系统

说明:本博文来自CSDN-问答板块,题主提问。 需要:学校拟开发一套食堂菜品管理系统,以便对菜品和同学们的评价进行管理,其中包含如下信息: 商户:商户名称、柜面位置、电话…… 菜品:菜品编号、菜品名称、价格、所属商户…… 学生:注册账号、昵称、电话…… 食堂里的商户…