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

从Maven工程到一键分发:我的Java应用jpackage打包自动化脚本进化史(Linux版)

从Maven工程到一键分发我的Java应用jpackage打包自动化脚本进化史Linux版作为一名长期奋战在Java应用交付前线的开发者我深刻理解从代码到可执行文件的最后一公里有多重要。本文将分享如何将零散的打包操作转化为一套健壮的自动化流水线特别针对Linux环境下使用jpackage工具时遇到的典型痛点提供工程化解决方案。1. 自动化打包架构设计1.1 环境隔离与版本控制在团队协作场景中JDK版本不一致是导致在我机器上能运行问题的首要原因。我们的解决方案是#!/bin/bash # 自动检测并下载指定版本JDK JDK_VERSION21.0.2 JDK_URLhttps://github.com/adoptium/temurin21-binaries/releases/download/jdk-${JDK_VERSION}/OpenJDK21U-jdk_x64_linux_hotspot_${JDK_VERSION}.tar.gz if [ ! -d ./jdk-${JDK_VERSION} ]; then wget -q ${JDK_URL} -O jdk.tar.gz tar -xzf jdk.tar.gz rm jdk.tar.gz fi关键设计原则版本固化将JDK版本声明在脚本开头而非环境变量自包含目录JDK与项目同级存放避免污染系统环境自动下载首次运行时自动获取所需JDK1.2 Maven构建流程优化传统mvn clean package存在两个问题依赖下载不可控构建产物目录结构不符合jpackage要求改进后的构建阶段# 使用dependency:go-offline预下载依赖 mvn -B dependency:go-offline # 指定输出目录结构 mvn -B clean package -Dmaven.repo.local./repository \ -Dbuild.finalNamer11 \ -Dassembly.outputDirectory./publish/r11-jar提示-B参数确保在CI环境中以批处理模式运行避免交互式提示卡住流程2. 第三方JAR模块化处理实战2.1 自动化模块修补方案对于常见的PDFBox等非模块化依赖我们设计了一套通用处理流程操作步骤命令示例说明准备module-infojavac --patch-module为每个JAR准备适配JDK21的模块描述批量处理find ./lib -name *.jar遍历处理所有第三方依赖版本兼容--release 21确保字节码版本兼容性典型处理脚本片段#!/bin/bash for jar_file in $(find ./lib -name *.jar); do module_name$(basename ${jar_file} .jar) javac -p ./lib --patch-module${module_name}${jar_file} \ ./module-info/${module_name}/module-info.java jar -u -f ${jar_file} -C ./module-info/${module_name} module-info.class done2.2 字体问题的根治方案经过多次实践验证最可靠的字体解决方案是在resources目录放置字体文件src/main/resources/fonts/ └── NotoSansCJKsc-Regular.otf应用启动时动态加载Font.loadFont(getClass().getResourceAsStream(/fonts/NotoSansCJKsc-Regular.otf), 14);在CSS中统一声明.root { -fx-font-family: Noto Sans CJK SC; }3. 跨平台脚本可靠性保障3.1 换行符与编码标准化创建.editorconfig文件确保跨平台一致性[*.sh] end_of_line lf charset utf-8 insert_final_newline true3.2 文件权限自动化管理在CI流水线中添加预处理步骤steps: - name: Fix script permissions run: | find . -name *.sh -exec dos2unix {} \; find . -name *.sh -exec chmod x {} \;3.3 构建环境自检脚本开头加入健全性检查#!/bin/bash set -euo pipefail # 检查必要工具 for cmd in mvn java jar; do if ! command -v ${cmd} /dev/null 21; then echo 错误: 未找到${cmd}命令 exit 1 fi done # 检查磁盘空间 MIN_SPACE1024 # 1GB if [ $(df -BM . | awk NR2 {print $4} | tr -d M) -lt ${MIN_SPACE} ]; then echo 错误: 磁盘空间不足 exit 1 fi4. CI/CD集成实践4.1 GitLab CI配置示例stages: - package jpackage: stage: package image: maven:3.8-openjdk-21 script: - chmod x ./build.sh - ./build.sh artifacts: paths: - ./publish/r11/ expire_in: 1 week4.2 构建缓存优化通过分层Docker镜像加速CIFROM eclipse-temurin:21-jdk as builder RUN apt-get update apt-get install -y maven COPY . /app WORKDIR /app RUN ./build.sh FROM scratch as artifact COPY --frombuilder /app/publish/r11 /r114.3 版本号自动化从pom.xml自动提取版本信息APP_VERSION$(mvn -q \ -Dexec.executableecho \ -Dexec.args${project.version} \ --non-recursive \ exec:exec)5. 性能优化与产物瘦身5.1 JLink定制化裁剪--jlink-options --compress2 \ --jlink-options --no-header-files \ --jlink-options --no-man-pages \ --jlink-options --strip-debug \ --jlink-options --include-localeszh,en5.2 多模块应用打包策略对于Spring Boot等多模块项目--module-path publish/r11-jar:publish/lib \ --module com.example/com.example.MainApp \ --add-modules org.spring.boot \ --add-modules org.apache.logging5.3 构建产物分析工具使用jdeps分析依赖关系jdeps --ignore-missing-deps \ --multi-release 21 \ --print-module-deps \ target/r11.jar经过三个月的持续迭代这套自动化打包系统已将原本需要45分钟的手动操作缩短为7分钟的无人值守流程。最令人欣慰的是新加入团队的开发者只需执行./build.sh就能获得完全一致的构建产物彻底告别了环境差异的魔咒。

相关文章:

从Maven工程到一键分发:我的Java应用jpackage打包自动化脚本进化史(Linux版)

从Maven工程到一键分发:我的Java应用jpackage打包自动化脚本进化史(Linux版) 作为一名长期奋战在Java应用交付前线的开发者,我深刻理解从代码到可执行文件的最后一公里有多重要。本文将分享如何将零散的打包操作转化为一套健壮的自…...

避坑指南:RM65-B机械臂拓展轴MoveIt配置中最容易忽略的5个参数设置

RM65-B机械臂拓展轴MoveIt配置中最容易忽略的5个参数设置 当工程师第一次尝试为RM65-B机械臂配置拓展轴时,往往会遇到机械臂与拓展轴运动不同步的问题。这种不同步不仅影响工作效率,还可能造成安全隐患。本文将深入剖析5个最容易被忽视的关键参数设置&am…...

4个维度精通IPED插件依赖管理:从冲突解决到部署优化

4个维度精通IPED插件依赖管理:从冲突解决到部署优化 【免费下载链接】IPED IPED Digital Forensic Tool. It is an open source software that can be used to process and analyze digital evidence, often seized at crime scenes by law enforcement or in a cor…...

5大核心功能打造专业视频应用:LibVLCSharp全场景实战指南

5大核心功能打造专业视频应用:LibVLCSharp全场景实战指南 【免费下载链接】libvlcsharp Cross-platform .NET/Mono bindings for LibVLC 项目地址: https://gitcode.com/gh_mirrors/li/libvlcsharp LibVLCSharp - VLC媒体框架的.NET封装库,为开发…...

ComfyUI工作流开发入门:为Qwen-Image-Edit-F2P定制专属人脸编辑节点

ComfyUI工作流开发入门:为Qwen-Image-Edit-F2P定制专属人脸编辑节点 你是不是已经玩熟了ComfyUI里那些现成的节点,拖拖拽拽就能做出不错的图?但有时候,是不是总觉得少了点什么?比如,用Qwen-Image-Edit-F2P…...

三步实现大麦网自动化工具效率提升:从抢票难题到全场景应用

三步实现大麦网自动化工具效率提升:从抢票难题到全场景应用 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase Automatic_ticket_purchase作为一款基于Python开发的大…...

2026年这8款Linux终端模拟器,很值得一试

在2026年的Linux世界里,虽然大多数发行版(如Ubuntu、Fedora、Neon等)的图形界面已经非常成熟,日常操作几乎不需要敲命令行,但只要你是开发者、运维工程师、极客玩家,或者偶尔需要SSH、Git、Docker、系统调试,终端依然是不可或缺的生产力核心。 过去几年,终端模拟器领域…...

【技术解析】交叉注意力网络在小样本分类中的关键作用与实现

1. 小样本分类的困境与突破 想象一下,你面前突然出现一种从未见过的珍稀鸟类,而手头只有3张它的照片。作为鸟类学家,你需要仅凭这几张照片就能在野外准确识别这种鸟类——这就是典型的小样本分类(Few-shot Classification&#xf…...

软件著作权:数字时代的代码守护者——144元开启版权保护之路

引言在数字化浪潮席卷全球的今天,代码已不仅仅是冰冷的字符组合,而是开发者智慧与心血的结晶。每一行代码都承载着创造者的思维逻辑与创新理念,而软件著作权(简称"软著")正是为这份珍贵成果筑起的法律防护墙…...

408考研党必看:浮点数IEEE754标准详解与实战避坑指南

408考研党必看:浮点数IEEE754标准详解与实战避坑指南 如果你正在备战计算机考研408科目,浮点数表示与运算一定是绕不开的重点难点。IEEE754标准作为现代计算机浮点数的事实规范,每年都会在考试中占据相当分值。但很多同学在面对"对阶-尾…...

Moises vs 其他AI分离工具深度横评:2024年音乐人该如何选择?

Moises vs 其他AI分离工具深度横评:2024年音乐人该如何选择? 当一段复杂的交响乐录音需要提取单簧管声部,或是直播现场需要实时消除伴奏保留人声,音乐人面临的工具选择从未像今天这样丰富而令人困惑。2024年的AI音频分离领域已从早…...

Spring AI实战:5分钟搞定OpenAI聊天机器人(附完整代码)

Spring AI实战:5分钟构建智能对话系统的完整指南 在Java生态系统中,Spring框架一直是企业级应用开发的首选。随着AI技术的普及,Spring社区推出了Spring AI项目,让Java开发者能够轻松集成大语言模型能力。本文将带您从零开始&#…...

OSG + Qt 6实战:5步打造你的第一个3D点云可视化桌面应用

OSG Qt 6实战:5步打造你的第一个3D点云可视化桌面应用 在工业测量、自动驾驶和数字孪生等领域,点云数据的可视化一直是开发者面临的挑战。传统方案要么缺乏交互性,要么难以集成到现代用户界面中。本文将带你用OSG(OpenSceneGraph…...

ChatTTS 0.85 技术解析:从语音合成原理到生产环境部署

最近在折腾语音合成项目,正好深度体验了 ChatTTS 0.85 这个版本。它作为一款开源的、强调对话风格的文本转语音工具,在社区里热度挺高。今天这篇笔记,我就从一个实践者的角度,聊聊它的技术内核、怎么用起来,以及要上生…...

e2fsprogs-1.46.2 交叉编译实战:从配置到问题排查

1. 为什么需要交叉编译e2fsprogs? 在嵌入式开发中,我们经常遇到一个尴尬的情况:开发电脑是x86架构的,但目标设备却是ARM架构的。这就好比你想在Windows电脑上运行一个专门为Mac开发的软件,直接运行肯定行不通。e2fspro…...

Arcgis影像处理实战:5分钟搞定多图拼接与精准裁剪(附常见报错解决方案)

ArcGIS影像处理实战:多图拼接与精准裁剪高效工作流 引言:为什么需要掌握影像拼接与裁剪技术 在空间数据分析领域,影像拼接与裁剪是最基础却至关重要的操作环节。无论是环境监测中的卫星影像处理,还是城市规划中的航拍图整合&#…...

BookLore API自定义工具开发指南:从功能模块到实践应用

BookLore API自定义工具开发指南:从功能模块到实践应用 【免费下载链接】booklore BookLore is a web app for hosting and managing books on a home server. It allows users to view PDFs, eBooks, and track reading progress. With features like metadata man…...

3款突破限制的全平台文件翻译工具:高效处理大文件的终极解决方案

3款突破限制的全平台文件翻译工具:高效处理大文件的终极解决方案 【免费下载链接】DeeplxFile 基于Deeplx和Playwright提供的简单易用,快速,免费,不限制文件大小,支持超长文本翻译,跨平台的文件翻译工具 / …...

KubeRay实战指南:在Kubernetes上轻松部署和管理Ray应用

KubeRay实战指南:在Kubernetes上轻松部署和管理Ray应用 【免费下载链接】kuberay A toolkit to run Ray applications on Kubernetes 项目地址: https://gitcode.com/GitHub_Trending/ku/kuberay KubeRay是一个强大的开源Kubernetes运算符,专门为…...

英雄联盟智能助手:用自动化与数据分析重构游戏体验

英雄联盟智能助手:用自动化与数据分析重构游戏体验 【免费下载链接】LeagueAkari ✨兴趣使然的,功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 在快节奏的英…...

魔兽争霸III现代化改造:3分钟搞定兼容性问题的终极指南

魔兽争霸III现代化改造:3分钟搞定兼容性问题的终极指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在现代电脑上运行…...

3个重构级技巧:用NHSE打造个性化动物森友会体验

3个重构级技巧:用NHSE打造个性化动物森友会体验 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE 核心价值:重新定义游戏创作边界 在动物森友会的世界里,每个玩家…...

华硕主板+Win7环境VirtualBox避坑指南:从BIOS虚拟化设置到CPU核心数调整

华硕主板Win7环境VirtualBox避坑实战手册 在技术迭代飞快的今天,许多开发者仍在使用企业淘汰的华硕主板搭配Windows 7系统搭建低成本实验环境。这种组合在运行VirtualBox时常常遇到各种"水土不服"的问题。本文将深入剖析这类特定硬件环境下的兼容性痛点&a…...

Nacos端口配置全攻略:从1.x到3.0版本差异详解(附防火墙规则)

Nacos端口配置全攻略:从1.x到3.0版本差异详解(附防火墙规则) 在微服务架构的浪潮中,Nacos作为阿里巴巴开源的动态服务发现、配置管理和服务管理平台,已经成为众多企业技术栈中的核心组件。随着版本的迭代,N…...

Youtu-Parsing作品集:跨境电商产品说明书→多语言版本自动对齐+核心参数抽取

Youtu-Parsing作品集:跨境电商产品说明书→多语言版本自动对齐核心参数抽取 1. 引言:当跨境电商遇上多语言产品说明书 想象一下这个场景:你是一家跨境电商公司的产品经理,公司的一款智能手表要同时销往美国、德国、日本和巴西市…...

高效Git集成实战:Claude Code UI版本控制完整指南

高效Git集成实战:Claude Code UI版本控制完整指南 【免费下载链接】claudecodeui Claude Code UI is a web and mobile friendly app UI for Claude Code CLI that allows you to view all Claude code sessions and projects and access them remotely 项目地址:…...

当ECU说‘不’时:手把手教你读懂UDS诊断中的那些‘负响应码’(NRC)

当ECU说‘不’时:手把手教你读懂UDS诊断中的那些‘负响应码’(NRC) 第一次用CANoe发送UDS诊断请求时,看到ECU回复的0x7F或0x22等十六进制码,我盯着屏幕愣了半天——这就像跟一个说方言的外国人吵架,他明明回…...

云容笔谈·东方红颜实战:为STM32项目文档自动生成示意图

云容笔谈东方红颜实战:为STM32项目文档自动生成示意图 1. 引言:嵌入式开发者的绘图烦恼 如果你做过嵌入式开发,尤其是基于STM32这类MCU的项目,一定有过这样的经历:项目代码写完了,功能也调通了&#xff0…...

GIS开发新风口:3S专业如何抓住智慧城市与数字孪生机遇(含薪资数据)

GIS开发新风口:3S专业如何抓住智慧城市与数字孪生机遇 在数字化浪潮席卷全球的今天,地理信息技术(GIS)正经历着前所未有的变革。传统的地图制作和空间分析已经不能满足现代社会的需求,GIS开发正在向更智能、更集成的方向发展。对于3S专业&…...

LightOnOCR-2-1B完整指南:Web界面和API调用,两种方式任你选

LightOnOCR-2-1B完整指南:Web界面和API调用,两种方式任你选 1. 引言:为什么选择LightOnOCR-2-1B 在日常工作和数据处理中,我们经常遇到需要从图片中提取文字的场景。无论是扫描的文档、拍摄的收据,还是截图中的文字信…...