Java Swing桌面项目打包成可执行jar

前言

最近有需求,将Swing项目打包为一个可执行的jar包,遇见了一些问题,参考AI助手,解决了遇到的问题,也有一些亲身实践体会,记录一下。开发环境IntelliJ IDEA,JDK8,用kotlin语言实现了一些类。

1.IDEA打jar包配置,没有用gradle或maven

内容来源某一言
如果你没有使用 Gradle,你可以按照以下步骤手动打包你的 Swing 项目为可执行的 JAR 文件:

  1. 确保你的项目设置正确:

    • 确保你的项目是一个 Kotlin Swing 项目,并且所有源代码都在正确的目录结构中。
  2. 打开你的项目在 IntelliJ IDEA 中:

  3. 配置项目:

    • 在项目视图中,找到并右击你的项目。
    • 选择 “Open Module Settings” 或 “Project Structure”。
    • 在左侧菜单中选择 “Modules”。
    • 在右侧的 “Dependencies” 选项卡中,确保你的所有依赖都被正确添加。对于 Swing,你可能需要添加一些库或框架的依赖。
  4. 创建可执行的 JAR 文件:

    • 打开项目结构设置后,选择 “Artifacts”。
    • 在左侧的列表中,选择 “Kotlin class” 或类似的选项。
    • 在右侧,选择 “From Modules with dependencies”。
    • 在 “Output layout” 中,确保你的主类和资源都被包含在内。
    • 在 “Build on make” 下拉菜单中,选择一个适当的选项,如 “package project into a single file”。
    • 点击 “OK” 来关闭对话框。
  5. 生成 JAR 文件:

    • 在 IntelliJ IDEA 的顶部菜单中,选择 “Build” 或 “Rebuild Project”。这将会重新构建你的项目并生成 JAR 文件。
  6. 找到并运行 JAR 文件:

    • 在项目目录下的 out/artifacts/ 文件夹中找到生成的 JAR 文件。
    • 使用命令行或终端,导航到该文件夹并运行以下命令来执行 JAR 文件:
    bash`java -jar yourprojectname.jar`
    

    这里 yourprojectname.jar 是你的 JAR 文件名。确保你有足够的权限来执行这个文件。如果你在 Windows 上,你可能需要使用 .exe 后缀来执行 JAR 文件。例如:java -jar yourprojectname.jar.exe

2.资源的处理

在使用资源的时候,需要注意这个问题,比如图片、音频等,在开发阶段,使用方法和打包为可执行jar后还是有区别的。不然可能造成资源读取失败。

>imagebg_key.png
>pageWork.java
    val path = javaClass.getResource("../image/bg_key.png")println(path)var img = ImageIO.read(path)

上面这段代码是根据相对路径读取图片资源,图片保存在一个java package文件夹中,这样运行起来,可以正常读取到图片。

可是如果打包为可执行jar,程序就出错了。报错类似下图
在这里插入图片描述
这种情况可以使用Class.getResourceAsStream() 方法来读取资源,路径的话就是jar包中的路径,注意加/,/代表jar文件的根目录路径。

val stream = javaClass.getResourceAsStream("/game/image/bg_key.png")
val img = ImageIO.read(stream)

实践证明,也可以继续使用Class.getResource()方法,只要资源路径没问题,就能正常读取到资源。

2.资源处理参考某一言

当你将一个 Java 项目打包为一个可执行的 JAR 文件时,类的 class 路径和 JAR 文件的 class 路径是不同的。在打包之前,你可以通过相对路径或绝对路径来访问类路径下的资源。但在打包为 JAR 文件后,这些资源被包含在 JAR 文件中,不再是类路径下的文件。

如果你在打包后的 JAR 文件中尝试使用类路径来访问图片文件,那么将会失败,因为 JAR 文件并不包含类路径下的文件结构。

要解决这个问题,你可以使用以下方法之一:

  1. 使用 Class.getResourceAsStream() 方法:
    这是最常见的方法,用于从 JAR 文件中读取资源。这种方法使用的是 JAR 文件的资源路径,而不是类路径。例如:
InputStream inputStream = YourClass.class.getResourceAsStream("/images/my_image.png");

注意,路径前面的 / 是必需的,它表示从 JAR 文件的根目录开始查找资源。
2. 将资源放在正确的位置:
确保你的图片文件放在了正确的位置,以便能够通过 getResourceAsStream() 方法正确地访问它。通常,你可以将资源放在与类相同的包中,或者放在一个单独的包中,并在 getResourceAsStream() 方法中使用适当的路径。
3. 使用外部资源:
如果你的应用程序需要访问外部文件或目录中的资源,而不是从 JAR 文件中访问资源,那么你可能需要将这些资源放在一个外部位置(例如文件系统中的一个文件夹),并在代码中提供适当的路径来访问它们。
4. 修改构建脚本:
如果你使用 Gradle 或 Maven 等构建工具,你可以修改构建脚本,以便在打包 JAR 文件时将资源包含在内。例如,在 Gradle 中,你可以使用 resources 配置来包含资源。

总之,当你在打包 JAR 文件后遇到资源访问问题时,关键是要了解 JAR 文件和类路径之间的区别,并使用适当的方法来访问资源。

4.总结

参考AI助手,解决问题快多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650711.shtml

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

相关文章

navicat连接postgresql、人大金仓等数据库报错

navicat连接postgresql、人大金仓数据库报错问题是一个偶现的问题,需要我们特别关注: 1、客户端连接人大金仓数据库 这里注意:navicat连接postgresql、人大金仓数据库时均选择postgresql类型,因为人大金仓数据库底层和psql数据库…

【第五天】蓝桥杯备战

1、金币 https://www.lanqiao.cn/problems/357/learning/ 解法:暴力 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此输入…

01_Anaconda环境搭建

概述 Anaconda包含了许多常用的科学计算和数据分析的库和工具。通过Anaconda,用户可以更方便地安装、管理和更新这些库和工具,从而提高工作效率。 Anaconda还提供了一个名为conda的包管理器,可以帮助用户方便地安装、管理和更新这些库和工具…

写静态页面——魅族声学_前端页面练习

1、效果: 1、html代码: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>魅族声学</titl…

金智易表通构建学生缴费数据查询+帆软构建缴费大数据报表并整合到微服务

使用金智易表通挂接外部数据,快速建设查询类服务,本次构建学生欠费数据查询,共有3块设计,规划如下: 1、欠费明细查询:学校领导和财务处等部门可查询全校欠费学生明细数据;各二级学院教职工可查询本二级学院欠费学生明细数据。 2、大数据统计报表:从应收总额、欠费总额…

Spring与Redis集成

1.引入RedisTemplate 据以前的情况&#xff0c;我们在Java中使用Redis时一般是使用Jedis来操作的&#xff0c;大致的一段代码如下所示 Overridepublic User findUserById(Integer id) {User user null;Jedis jedis null;try {jedis jedisPool.getResource();String userStr…

直接在GitHub上使用vscode阅读源码

方法&#xff1a; 直接在github后面输入1s即可 效果&#xff1a;

光学系统的核心--分辨率

前言 在机器视觉领域&#xff0c;可以把各个部件划分为光源&#xff0c;镜头&#xff0c;相机&#xff0c;采集卡&#xff0c;算法&#xff0c;运动平台等。各个部件都是系统的有机组合&#xff0c;均有各自的重要性。在实际应用中&#xff0c;成像镜头涉及的光学理论较多&…

[数据结构]-哈希

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习目标&…

智能工厂4G无线设备预测维护云端联动的DI、AI、DO混合信号处理单元

在现代工业智能化进程中&#xff0c;一款集成了丰富I/O接口并能与各大云平台无缝对接的智能设备显得尤为重要。比如最近推出的这款创新产品&#xff0c;它集合了8路数字输入通道&#xff0c;涵盖了干湿节点的识别功能&#xff0c;适用于多种开关量信号的读取&#xff1b;同时&a…

(八)springboot实战——springboot3下的webflux项目全局异常处理

前言 在webflux响应式编程中&#xff0c;如何处理系统运行时异常是本节的主要内容。在传统的Servlet阻塞式web项目中主要通过HandlerExceptionResolver处理器来处理&#xff0c;而在webflux响应式web项目中&#xff0c;则是通过DispatchExceptionHandler异常处理器来处理异常。…

[SWPUCTF 2018]SimplePHP1

打开环境 有查看文件跟上传文件&#xff0c;查看文件里面显示没有文件url貌似可以文件读取 上传文件里面可以上传文件。 先看一下可不可以文件读取 /etc/passwd不能读取&#xff0c;源码提示flag在f1ag.php 看看能不能读取当前的文件&#xff0c; 先把代码摘下来 file.php …

JavaScript 之 作用域变量提升闭包

一、JavaScript 代码的执行 浏览器内核是由两部分组成的&#xff0c;以 webkit 为例 WebCore&#xff1a;负责HTML解析、布局、渲染等等相关的工作JavaScriptCore&#xff1a;解析、执行 JavaScript 代码 另外一个强大的 JavaScript 引擎就是 V8 引擎 二、深入 V8 引擎原理 …

Java面向对象三大特征之多态

在之前的文章&#xff0c;我们分别介绍了类与对象、面向对象三大特征的封装、以及继承&#xff08;一&#xff09;、继承&#xff08;二&#xff09;。这一篇文章&#xff0c;我们介绍Java面向对象三大特征的最后一个——多态。 多态 多态的概述 概念&#xff1a;完成某个行为…

CVE-2024-23897 Jenkins 任意文件读取漏洞

项目介绍 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。Jenkins是开源CI&CD软件领导者&#xff0c; 提供超过1000个插…

Java集合相关面试题

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于java面试题系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基…

C# 设置一个定时器函数

C#中&#xff0c;创建设置一个定时器&#xff0c;能够定时中断执行特定操作&#xff0c;可以用于发送心跳、正计时和倒计时等。 本文对C#的定时器简单封装一下&#xff0c;哎&#xff0c;以方便定时器的创建。 定义 using Timer System.Timers.Timer;class SetTimer {Timer …

OSPF协议基础(OSPF工作过程)

目录 OSPF基本工作原理邻居建立过程Router ID发现并建立邻居 - Hello报文OSPF邻居建立过程 链路状态信息丰富的数据链路层支持能力网络类型 - P2P网络网络类型 - 广播型网络网络类型 - NBMA网络网络类型 - P2MP网络OSPF的度量方式 报文类型及作用OSPF协议报文头部OSPF报文类型O…

k8s-调度

调度 从上面的架构图我们可以看到,调度是工作在Master,负责调度Pod&#xff0c;为POD分配Node。 调度的工作原理 #查看所有的Node kubectl get nodes 我们可以看到节点有一个Name,这就是调度的关键。 调度的步骤&#xff1a; 1 创建POD的时候每一个POD都会有一个叫NodeName的…

老板为何都对项目经理毕恭毕敬!因为这个职位一念成佛一念成魔

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 老板为何都对项目经理毕恭毕敬&#xff01;因为这个职位一念成佛一念成魔 曾几何时&am…