讲师中心 微信公众号
AI工具推荐 视频效率加速

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

小浩小哥_3899

小浩小哥_3899

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

|

975人浏览过

|

来源于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免费学习笔记(深入)”;

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载
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工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

11777

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

8882

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

7612

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1244

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1008

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1496

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

3089

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20351

2023.08.03

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn