【错误记录】exe4j 打包程序无法设置 jar 包依赖的问题 ( 将源码 和 依赖库打包到同一个 jar 包中 )

2023-08-31 18:30:28





一、问题描述



【错误记录】IntelliJ IDEA 导出可执行 jar 包执行报错 ( java.lang.ClassNotFoundException | 打包时没有选择依赖库 ) 博客中遇到

java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)

报错信息 , 这里就在打包时 , 采取了如下策略 ;

由于编译 IntelliJ IDEA 程序时 , 选择了 第二种 Jar 包打包方式 , 导致 主程序 与 依赖库是分开打包的 ;

在这里插入图片描述

最终的主程序 与 依赖库 都是分开的 , 使用 主程序 时 , 必须额外配置依赖库 ;

在这里插入图片描述


这里有涉及到另外一个问题 , 想要使用 exe4j 将上述 jar 包打包成一个 Windows 程序 ,

将 Jar 包 与 Java 虚拟机打包在一起 , 捆绑成一个可执行的 exe 程序 ;

但是 exe4j 打包时 , 无法设置 jar 包的依赖库 , 只能设置一个 jar 包 ;


研究了下 exe4j 的文档 , 得到以下结论 :

在这里插入图片描述

  • exe4j 打包程序无法设置 jar 包依赖 , 只能设置一个 jni 相关的 native 的 .a 静态库 和 .so 动态库 依赖目录 ;
  • exe4j 也不能设置 java 命令执行参数 , 如果可以设置参数 , 可以通过 -classpath 选项设置 依赖库 ;
  • 还有一种方式可以通过命令行传入参数 , 但是打包的程序是一个途径界面程序 ;

这就比较尴尬了 , IntelliJ IDEA 打包出来的是一个 jar 包 + 若干 jar 依赖库 , 无法设置到 exe4j 中 ;


在 exe4j 执行时 , 会报错 , 无法找到依赖 , 自然也不能找到相关的类 ;

java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)




二、解决方案



在 IntelliJ IDEA 中 , 导出 jar 包时 , 选择第一种方案设置 , 然后将所有的 java 源码打包在一起 ;

在这里插入图片描述

打包后的效果如下 , 所有的 Java 源码都打包在了一个 jar 包中 ;

在这里插入图片描述

注意 , 要删除 META-INF 目录下的签名文件 ;
在这里插入图片描述

【错误记录】IntelliJ IDEA 打包包含依赖库的 Jar 包执行报错 ( Invalid signature file digest for Manifest main attribute ) 博客中 , 遇到了签名文件出错的问题 ;

更多推荐

如何学习java

带着问题去学?为什么我们debug的时候代码会停在哪一个位置什么是多态?(这个在类的生命周期里面寻找答案)我们学习java就是从代码到成为程序的过程所以这很明显就是我们的编译原理和os打交道这很明白就是操作系统和另一台机器打交道,那么就是计算机网络java指令8个从代码到程序就是从代码到字节码(javap命令可以看到)

七、运算符

运算符1.运算符1.1.赋值运算符1.2.算数运算符1.3.自增和自减运算符1.4.比较运算符1.5.逻辑运算符1.6.位运算符1.6.1.按位与运算1.6.2.按位或运算1.6.3.按位取反运算1.6.4.按位异或运算1.6.5.移位操作1.6.6.复合赋值运算符1.6.7.三元运算符1.6.8.运算符优先级1.7.

Linear Feedback Shift Register

线性反馈移位寄存器(LinearFeedbackShiftRegister,简称LFSR)是一种数字电路设计和密码学中常用的寄存器类型。它是一种简单而高效的方式,用于生成伪随机的二进制序列,并在数据混淆、错误检测和加密等领域中有应用。LFSR通常用于流密码的生成。以下是LFSR的关键特性和组成部分:移位寄存器:LFSR

应用程序接口(API)安全的入门指南

本文简单回顾了API的发展历史,其基本概念、功能、相关协议、以及使用场景,重点讨论了与之相关的不同安全要素、威胁、认证方法、以及十二项优秀实践。根据有记录的历史,随着Salesforce的销售自动化解决方案的推出,首个WebAPI在1990年底出现了。在那个时候,它是一种每个人都可以访问到的开放资源。Salesforc

MySQL常用操作

目录1.安装MySQL/MariaDB2.用户管理2.1用户信息2.2用户权限privileges3.增删改查3.1增删数据库/表3.2查询参考1.安装MySQL/MariaDB#1)确认是否已安装mysqlrpm-qa|grepmysql#2)(如无)执行以下命令进行安装##方法一yuminstallmysql-y#

docker介绍及入门举例

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker的主要优点有:1.提供了一种在任何地方创建、运行和分发应用程序的方法,而不仅仅是在虚拟机

Centos系统常见配置(详细)总结

目录一、简介二、具体内容1、设置静态ip2、重启网络3、ssh登录时自动运行命令4、新增用户并创建家目录5、终端显示bash-4.2#6、更换yum源7、centos系统串口终端自动登陆8、系统启动通过rc.local自动执行脚本9、关闭防火墙10、设置samba三、其他相关链接Ubuntu系统设置常见问题处理详细总结

iOS16新特性:实时活动-在锁屏界面实时更新APP消息 | 京东云技术团队

简介之前在《iOS16新特性:灵动岛适配开发与到家业务场景结合的探索实践》里介绍了iOS16新的特性:实时更新(LiveActivity)中灵动岛的适配流程,但其实除了灵动岛的展示样式,LiveActivity还有一种非常实用的应用场景,那就是锁屏界面实时状态更新:上图是部分已经做出适配的APP,锁屏实时活动的展示。可

RabbitMQ常见问题

一、RabbitMQ如何保证消息不丢失?这是面试时最喜欢问的问题,其实这是个所有MQ的一个共性的问题,大致的解决思路也是差不多的,但是针对不同的MQ产品会有不同的解决方案。而RabbitMQ设计之处就是针对企业内部系统之间进行调用设计的,所以他的消息可靠性是比较高的。1、哪些环节会有丢消息的可能?我们考虑一个通用的MQ

微服务 第二章 CountDownLatch和Semaphone的应用

系列文章目录第二章CountDownLatch和Semaphone的应用第一章Java线程池技术应用文章目录系列文章目录前言1、CountDownLatch1.1、应用场景2、Semaphone前言JavaJUI之并发编程,CountDownLatch和Semaphone的应用1、CountDownLatchCount

【机器学习】TF-IDF以及TfidfVectorizer

TF-IDF定义TF-IDF:全称为"词频一逆文档频率"。TF:某一给定词语在该文档中出现的频率。TFw=词语w在该文档中个数该文档内总词个数TF_w=\frac{词语w在该文档中个数}{该文档内总词个数}TFw​=该文档内总词个数词语w在该文档中个数​。IDF:整个训练集文档集合一共由NNN篇文档组成,其中包含某个给

热文推荐