当前位置: 首页 > news >正文

如何利用maven更优雅的打包

最近在客户现场部署项目,有两套环境,无法连接互联网,两套环境之间也是完全隔离,于是问题就来了,每次都要远程到公司电脑改完代码,打包,通过网盘(如果没有会员,上传下载慢)或者远程工具传输,再用u盘拷贝到客户电脑,一个包400多Mb(所有的代码和依赖包以及配置文件都打在了一个jar包里面),传输一次10分钟,效率太低了,于是翻越资料找到一中更优雅的打包方式,每次只需要更新改过的包和配置文件即可,大大减少传输大小。

我们先看看nacos的压缩包解压开来的效果:

可以看到是一种很标准的打包方式,解压开来的文件夹都能够见名知意,下面是我改完maven打包方式之后的效果,实际过程中,也可以根据需要把脚本放到bin目录里面,只是我图简单,把停止和启动都写在了一个脚本里面,这么打包的好处是,后续改了代码和配置只需要替换相应的jar包和配置文件即可,而不用全量更新,我们自己写的代码jar包通常都是kb单位,远程桌面传输起来也很快:

conf:配置文件目录里面包含了logback配置文件,项目依赖的application.yml等配置文件:

lib:依赖的jar,包括第三方依赖包和自己项目里面的common,api等:

gisadmin-boot.jar:springboot启动类所在的jar包,start.sh启动脚本里面启动命令指定的就是这个jar

start.sh:启动脚本:

ps -ef | grep gisadmin-boot | grep -v grep | awk '{print $2}' | xargs -r kill -9# 等待几秒以确保进程被正确杀死
sleep 2# 确保日志目录存在
mkdir -p ./logs# 绝对路径启动 Java
nohup java -Duser.timezone=Asia/Shanghai -Dfile.encoding=utf-8 -cp ./gisadmin-boot.jar com.daspatial.gis.EarthApplication  > ./logs/gisadmin.log 2>&1 &sleep 2

下面就是关键的maven配置了(只写关键变更部分):

1、不同的环境,激活不同的配置:在maven打包命令执行的时候指定,比如mvn clean compile package -Pdev -DskipTests,其中-Pdev就是激活dev环境的配置

    <profiles><profile><id>dev</id><properties><profileActive>dev</profileActive></properties><activation><activeByDefault>true</activeByDefault></activation></profile><profile><id>wutiegaw</id><properties><profileActive>wutiegaw</profileActive></properties></profile><profile><id>wutie</id><properties><profileActive>wutie</profileActive></properties></profile><profile><id>prod</id><properties><profileActive>prod</profileActive></properties></profile></profiles>

2、build节点配置:

<build><!--最终打出来的包名--><finalName>${project.artifactId}</finalName><!--java代码源文件目录--><sourceDirectory>${basedir}/src/main/java</sourceDirectory><!--资源文件目录,主要是配置文件,也就是src/main/resources目录--><resources><resource><directory>${basedir}/src/main/java</directory><filtering>true</filtering><excludes><exclude>**/*.java</exclude></excludes></resource><resource><directory>${basedir}/src/main/resources</directory><excludes><exclude>**/assembly.xml</exclude></excludes></resource><resource><directory>${basedir}/src/main/env/${profileActive}</directory></resource></resources><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifestEntries><!--配置文件独立输出到conf目录--><Class-Path>conf/</Class-Path></manifestEntries><manifest><!--依赖包独立输出到lib目录--><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest></archive><excludes><!--这里是为了防止配置文件被打进启动类所在的jar里面--><exclude>**/*.yml</exclude><exclude>**/*.xml</exclude></excludes></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>2.6</version><configuration><appendAssemblyId>false</appendAssemblyId><descriptors><!--assembly插件配置文件--><descriptor>${basedir}/src/main/resources/assembly.xml</descriptor></descriptors></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-deploy-plugin</artifactId><configuration><skip>true</skip></configuration></plugin></plugins></build>

3、assembly插件配置文件assembly.xml:

<?xml version="1.0"?>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"><id>${version}</id><formats><!-- zip,tar,tar.gz,tar.bz2,jar,dir,war --><format>tar.gz</format></formats><includeBaseDirectory>true</includeBaseDirectory><fileSets><fileSet><!--源代码中的bin目录输出到压缩包根目录--><directoryMode>0777</directoryMode><directory>${basedir}/src/bin</directory><fileMode>0777</fileMode><outputDirectory>.</outputDirectory><lineEnding>unix</lineEnding></fileSet><fileSet><!--激活的profile配置文件输出到conf目录--><directory>${basedir}/src/main/env/${profileActive}</directory><outputDirectory>conf</outputDirectory></fileSet></fileSets><files><file><!--logback配置文件输出到conf目录--><source>${basedir}/src/main/resources/logback.xml</source><outputDirectory>conf</outputDirectory></file><file><source>${basedir}/src/main/resources/banner.txt</source><outputDirectory>conf</outputDirectory></file><file><!--启动类jar输出到压缩包根目录--><source>${basedir}/target/${project.artifactId}.jar</source><outputDirectory>.</outputDirectory></file></files><dependencySets><dependencySet><useProjectArtifact>true</useProjectArtifact><outputDirectory>lib</outputDirectory><excludes><exclude>${project.groupId}:${project.artifactId}</exclude></excludes></dependencySet></dependencySets>
</assembly>

项目目录结构如下:

改完之后可能会出现spring无法加载配置文件,只需要右键选中dev环境加入到资源目录即可,也就是默认激活dev环境配置:

相关文章:

如何利用maven更优雅的打包

最近在客户现场部署项目&#xff0c;有两套环境&#xff0c;无法连接互联网&#xff0c;两套环境之间也是完全隔离&#xff0c;于是问题就来了&#xff0c;每次都要远程到公司电脑改完代码&#xff0c;打包&#xff0c;通过网盘&#xff08;如果没有会员&#xff0c;上传下载慢…...

音频进阶学习十二——Z变换一(Z变换、收敛域、性质与定理)

文章目录 前言一、Z变换1.Z变换的作用2.Z变换公式3.Z的状态表示1&#xff09; r 1 r1 r12&#xff09; 0 < r < 1 0<r<1 0<r<13&#xff09; r > 1 r>1 r>1 4.关于Z的解释 二、收敛域1.收敛域的定义2.收敛域的表示方式3.ROC的分析1&#xff09;当 …...

cursor指令工具

Cursor 工具使用指南与实例 工具概览 Cursor 提供了一系列强大的工具来帮助开发者提高工作效率。本指南将通过具体实例来展示这些工具的使用方法。 1. 目录文件操作 1.1 查看目录内容 (list_dir) 使用 list_dir 命令可以查看指定目录下的文件结构: 示例: list_dir log…...

MySQL 主从读写分离实现方案(一)—MariaDB MaxScale实现mysql8读写分离

一&#xff1a;MaxScale 是干什么的&#xff1f;? MaxScale是maridb开发的一个mysql数据中间件&#xff0c;其配置简单&#xff0c;能够实现读写分离&#xff0c;并且可以根据主从状态实现写库的自动切换&#xff0c;对多个从服务器能实现负载均衡。 二&#xff1a;MaxScale …...

阿里云 | DeepSeek人工智能大模型安装部署

ModelScope是阿里云人工智能大模型开源社区 ModelScope网络链接地址 https://www.modelscope.cn DeepSeek模型库网络链接地址 https://www.modelscope.cn/organization/deepseek-ai 如上所示&#xff0c;在阿里云人工智能大模型开源社区ModelScope中&#xff0c;使用阿里云…...

LLAMA-Factory安装教程(解决报错cannot allocate memory in static TLS block的问题)

步骤一&#xff1a; 下载基础镜像 # 配置docker DNS vi /etc/docker/daemon.json # daemon.json文件中 { "insecure-registries": ["https://swr.cn-east-317.qdrgznjszx.com"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.c…...

STM32 CUBE Can调试

STM32 CUBE Can调试 1、CAN配置2、时钟配置3、手动添加4、回调函数5、启动函数和发送函数6、使用方法(采用消息队列来做缓存)7、数据不多在发送函数中获取空邮箱发送&#xff0c;否则循环等待空邮箱 1、CAN配置 2、时钟配置 3、手动添加 需要注意的是STM32CUBE配置的代码需要再…...

MySQL数据存储- 索引组织表

索引组织表 前言数据存储堆表索引组织表 二级索引二级索引的性能评估&#x1f539;为什么 idx_name 的性能开销最大&#xff1f;&#x1f539; 为什么 idx_last_modify_date 更新频繁会影响性能&#xff1f;分析二级索引性能表格为什么主键应该“紧凑且顺序”&#xff1f;二级索…...

基于STM32设计的仓库环境监测与预警系统

目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块的技术详情介绍总结 1. 项目开发背景 随着工业化和现代化的进程&#xff0c;尤其是在制造业、食品业、医药业等行业&#xff0c;仓库环境的监控和管理成为了至关重要的一环。尤其是在存储易腐…...

VSCode便捷开发

一、常用插件 Vue 3 Snippets、Vetur、Vue - Official 二、常用开发者工具 三、Vue中使用Element-UI 安装步骤&#xff1a; 1、在VSCode的终端执行如下指令&#xff1a; npm i element-ui -S 2、在main.js中全局引入&#xff1a; import Vue from vue; import ElementUI from …...

理解 Maven 的 pom.xml 文件

pom.xml 是 Maven 项目的核心文件&#xff0c;它是项目构建、依赖管理、插件配置和项目元数据的主要地方。通过 pom.xml 文件&#xff0c;Maven 知道如何构建项目、下载依赖库、执行测试等任务。每个 Maven 项目都必须包含一个 pom.xml 文件。本文将详细讲解 pom.xml 文件的结构…...

docker数据持久化的意义

Docker 数据持久化是指在 Docker 容器中保存的数据不会因为容器的停止、删除或重启而丢失。Docker 容器本身是临时性的&#xff0c;默认情况下&#xff0c;容器内的文件系统是临时的&#xff0c;容器停止或删除后&#xff0c;其中的数据也会随之丢失。为了确保重要数据&#xf…...

opentelemetry-collector 配置elasticsearch

一、修改otelcol-config.yaml receivers:otlp:protocols:grpc:endpoint: 0.0.0.0:4317http:endpoint: 0.0.0.0:4318 exporters:debug:verbosity: detailedotlp/jaeger: # Jaeger supports OTLP directlyendpoint: 192.168.31.161:4317tls:insecure: trueotlphttp/prometheus: …...

ASP.NET Core JWT Version

目录 JWT缺点 方案 实现 Program.cs IdentityHelper.cs Controller NotCheckJWTVersionAttribute.cs JWTVersionCheckkFilter.cs 优化 JWT缺点 到期前&#xff0c;令牌无法被提前撤回。什么情况下需要撤回&#xff1f;用户被删除了、禁用了&#xff1b;令牌被盗用了&…...

【ArcGIS】R语言空间分析、模拟预测与可视化技术

R语言在空间数据挖掘中具有广泛的应用&#xff0c;以下是一些关键内容和常用包的介绍&#xff1a; R语言空间数据挖掘的关键技术 空间数据类型 矢量数据&#xff1a;包括点&#xff08;Point&#xff09;、线&#xff08;Line&#xff09;、面&#xff08;Polygon&#xff09;等…...

日常知识点之面试后反思遗留问题汇总

梳理一下最近接触到的几个知识点&#xff1a; 1&#xff1a;突然问到端口复用 &#xff08;SO_REUSEADDR&#xff09; 端口复用一般用在服务端重启时&#xff0c;套接字处于time_wait状态时&#xff0c;无法绑定该端口&#xff0c;导致无法启动问题。 设置端口复用&#xff…...

链表(LinkedList) 1

上期内容我们讲述了顺序表&#xff0c;知道了顺序表的底层是一段连续的空间进行存储(数组)&#xff0c;在插入元素或者删除元素需要将顺序表中的元素整体移动&#xff0c;时间复杂度是O(n)&#xff0c;效率比较低。因此&#xff0c;在Java的集合结构中又引入了链表来解决这一问…...

Qt:Qt Creator项目创建

目录 认识Qt Creator Qt Creator概览 使用Qt Creator新建项目 选择项目模板 选择项目路径 选择构建系统 填写类信息设置界面 选择语言和翻译文件 选择Qt套件 选择版本控制系统 最终效果 认识Qt Creator Qt Creator概览 从开始菜单或者快捷方式打开Qt Creator集成开…...

windows11上,使用pipx安装Poetry,Poetry的安装路径是什么?

当使用 pipx 安装 Poetry 时&#xff0c;pipx 会将 Poetry 安装到一个独立的虚拟环境中&#xff0c;并将其可执行文件链接到一个集中的目录中。以下是 pipx 安装 Poetry 时的路径信息&#xff1a; 1. Poetry 的安装路径 pipx 会为每个工具&#xff08;如 Poetry&#xff09;创…...

详解状态模式

引言 水有固态、液态、气态三种状态&#xff0c;在不同条件下这三种状态可以相互转化。同样在软件设计中&#xff0c;有些对象也有不同的状态&#xff0c;不同状态的行为不同&#xff0c;状态模式就是用来处理这种情况的。 1.概念 状态模式(State Pattern)&#xff1a;允许一个…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...