0

0

Maven Java项目打包可执行JAR的完整指南:解决“双击无反应”问题

花韻仙語

花韻仙語

发布时间:2026-03-09 14:18:22

|

895人浏览过

|

来源于php中文网

原创

Maven Java项目打包可执行JAR的完整指南:解决“双击无反应”问题

maven项目默认生成的jar不包含依赖和主类声明,导致无法直接双击运行;需通过maven-jar-plugin配置manifest,并用maven-assembly-plugin构建含所有依赖的fat jar。

maven项目默认生成的jar不包含依赖和主类声明,导致无法直接双击运行;需通过maven-jar-plugin配置manifest,并用maven-assembly-plugin构建含所有依赖的fat jar。

在NetBeans中将Java Swing/FX项目从Ant迁移到Maven后,常遇到一个典型问题:编译成功、IDE内可正常运行(mvn javafx:run),但导出的.jar文件双击无响应、命令行执行报no main manifest attribute或ClassNotFoundException——这并非代码或Java环境故障,而是Maven默认打包机制与可执行JAR规范存在根本差异。

? 问题根源:Maven默认JAR ≠ 可执行JAR

  • Ant项目(如NetBeans旧模板)默认使用nbproject/project.properties配置main.class,并由IDE自动注入MANIFEST.MF中的Main-Class及Class-Path;
  • Maven的mvn package仅生成仅含自身编译字节码的JAR(即“thin JAR”),不包含任何依赖库(如Apache POI、JavaFX模块),也不写入可执行所需的MANIFEST属性
  • 即使你已正确声明于javafx-maven-plugin,该插件仅影响javafx:run生命周期,对最终生成的JAR文件无任何影响

✅ 正确解决方案:双插件协同构建fat JAR

你需要两个Maven插件协同工作:

  1. maven-jar-plugin:向JAR的META-INF/MANIFEST.MF写入Main-Class(必需)和Class-Path(可选);
  2. maven-assembly-plugin:将项目字节码 + 所有依赖JAR合并为单个“fat JAR”(又称uber JAR),确保运行时类路径完整。

以下是精简、可靠、经验证的pom.xml关键配置(已移除冗余插件和错误依赖):

<build>
    <plugins>
        <!-- Step 1: 配置可执行MANIFEST -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version> <!-- 推荐使用较新版本 -->
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.groupself.productpricelister.GroceryProductsLister</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

        <!-- Step 2: 构建含全部依赖的fat JAR -->
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.groupself.productpricelister.GroceryProductsLister</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

构建命令:在项目根目录执行

立即学习Java免费学习笔记(深入)”;

ChatTTS
ChatTTS

ChatTTS是一个开源的TTS文本转语音生成模型,专为对话场景设计。

下载
mvn clean package

成功后,目标目录下将生成两个JAR:

  • ProductPricesLister-1.0.jar(thin JAR,仅含本项目class,不可执行)
  • ProductPricesLister-1.0-jar-with-dependencies.jar(fat JAR,这才是你要双击或java -jar运行的文件

⚠️ 关键注意事项

  • 依赖版本一致性:原POM中poi与poi-ooxml版本不一致(5.0.0 vs 5.2.3),且错误添加了pom.sha512(应为jar)。务必统一使用相同版本(推荐5.2.4或5.3.0,兼容Java 11+):

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.4</version>
    </dependency>
  • JavaFX模块需显式处理:若使用JavaFX 11+(非JDK内置),javafx-controls等依赖需通过--module-path和--add-modules启动。maven-assembly-plugin无法自动处理模块路径。推荐方案
    ✅ 使用jlink构建自包含运行时镜像(生产首选);
    ⚠️ 或改用maven-shade-plugin(支持Transformers配置JavaFX模块反射);
    ❌ 避免在fat JAR中混入JavaFX类(易引发UnsupportedOperationException: Cannot load class)。

  • 调试技巧:当JAR双击无反应时,切勿仅依赖GUI反馈。请在终端执行:

    java -jar target/ProductPricesLister-1.0-jar-with-dependencies.jar

    实时查看异常堆栈(如NoClassDefFoundError、IllegalAccessError),这是定位依赖缺失或模块冲突的唯一可靠方式。

✅ 总结

Maven项目生成可执行JAR不是“开箱即用”,而是需主动声明打包契约。核心就两点:
① 用maven-jar-plugin注入Main-Class到MANIFEST;
② 用maven-assembly-plugin(或maven-shade-plugin)合并依赖生成fat JAR。
完成这两步,你的Excel数据管理工具就能像旧版TXT程序一样,双击即启、稳定运行——技术升级不该牺牲用户体验,而应通过正确的工程实践无缝承接。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1945

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2119

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1166

2024.11.28

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

439

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

601

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

439

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

601

2023.08.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 79.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号