多个数据库驱动并存情况下无法找到数据库驱动问题解决

最近在打fat-jar包时,出现一个问题,运行fat-jar时报错:

2024-03-08 10:08:08.772  WARN [Thread-5] c.k.s.f.ExternalFuncClassLoader          : 创建了未包含任何路径的自定义类加载器实例
2024-03-08 10:08:08.781  INFO [Thread-5] c.k.s.d.DataSourceConnectionPool         : Calcite连接池初始化完成![连接池最大连接数:10,最大空闲数:5,最小空闲数:3,等待时间:PT3S]
java.sql.SQLException: No suitable driver found for jdbc:h2:file:C:\Users\yingxu.zhao\JsonQuery;MODE=MySQL;DB_CLOSE_DELAY=-1;AUTO_RECONNECT=TRUE;AUTO_SERVER=TRUEat java.sql.DriverManager.getConnection(DriverManager.java:689)at java.sql.DriverManager.getConnection(DriverManager.java:270)at com.kanyun.sql.util.H2Utils.<clinit>(H2Utils.java:38)at com.kanyun.sql.core.column.JsonTableColumnFactory.loadTableColumnInfo(JsonTableColumnFactory.java:124)at com.kanyun.ui.JsonQuery.initConfig(JsonQuery.java:88)at com.kanyun.ui.AsyncInitializer.run(AsyncInitializer.java:40)at java.lang.Thread.run(Thread.java:748)
Exception in thread "Thread-5" java.lang.RuntimeException: java.lang.NullPointerExceptionat com.kanyun.ui.AsyncInitializer.run(AsyncInitializer.java:61)at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerExceptionat com.kanyun.sql.util.H2Utils.execQuery(H2Utils.java:47)at com.kanyun.sql.core.column.JsonTableColumnFactory.loadTableColumnInfo(JsonTableColumnFactory.java:124)at com.kanyun.ui.JsonQuery.initConfig(JsonQuery.java:88)at com.kanyun.ui.AsyncInitializer.run(AsyncInitializer.java:40)... 1 more

以上报错内容是使用maven-shade-plugin插件打包的,而换了maven-dependency-plugin打包也是同样的报错。

但是代码在IDEA中运行是没有问题的,报错提示的是找不到H2数据库驱动,查找打好包的fat-jar,里面是包含H2的驱动的。

这就很奇怪了,驱动明明在就是无法获取链接

然后找到一篇文章

java - No suitable driver found when exporting to a JAR-file? - Stack Overflow

里面的提问者,提到了他的应用里面同时使用了PostgreSQL和Mysql,由于数据库驱动使用了SPI机制,而打包时驱动的META-INF/services/java.sql.Driver并覆盖了,导致只能加载一个META-INF/services/java.sql.Driver。此时想到其实我的应用里面也有两个驱动 Calcite和H2。

然后就想到maven-shade-plugin是可以合并配置文件的。

找到以下文章:

使用Maven构建的可执行Jar无法在运行时解析多个数据库驱动程序的依赖关系 - IT屋-程序员软件开发技术分享社区

最终maven-shade-plugin配置如下:

<!--将项目的所有依赖项合并到单个可执行的JAR文件中,注意与maven-assembly-plugin插件的区别--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.5.2</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals></execution></executions><configuration><!--原始jar名称:xx.jar,最终输出名称 true:xx-shaded.jar false:xx.jar并修改原始名称为original-xx.jar--><shadedArtifactAttached>true</shadedArtifactAttached><!--生成名为dependency-reduced-pom.xml,这个POM文件去掉了原始pom中已被包含的进fat-jar的依赖项--><createDependencyReducedPom>true</createDependencyReducedPom><!-- 解决插件打包后运行报错:Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes--><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters><!--自动移除项目中没有使用到的依赖,以此来最小化 jar 包的体积--><!--<minimizeJar>true</minimizeJar>--><transformers><!-- 添加入口类 --><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><manifestEntries><!-- 入口类 --><Main-Class>${main-class}</Main-Class></manifestEntries></transformer><transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><!-- 合并服务,多个数据库驱动并存的情况不合并的话,H2驱动会报错(No suitable driver found for jdbc:h2:file)因为程序包含两个数据库驱动,Calcite和H2 --><resource>META-INF/services/java.sql.Driver</resource></transformer></transformers><artifactSet><!--默认所有的依赖都会被解压并平铺到最终的fat-jar中,这里指定要排除的依赖--><excludes><!--<exclude>*:hutool-all</exclude>--></excludes></artifactSet></configuration></plugin>

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

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

相关文章

leetcode 2834.找出美丽数组的最小和

这道题作者一开始用的暴力解法&#xff0c;效果还不错&#xff0c;但是对于特别大的数据是过不去的。 先讲一下我暴力的思路&#xff1a;作者用了双指针的解法&#xff0c;我们可以先定义一个数组&#xff0c;就是把数组从1开始考虑&#xff0c;n个连续整数输入到里面去。 然…

工业制氧机的使用与维护管理指南

工业制氧机是工业生产中不可或缺的重要设备&#xff0c;其高效稳定的供氧功能对于保障生产过程的顺利进行至关重要。为了确保工业制氧机能够持续高效地提供氧气&#xff0c;正确的使用方法和维护措施是必不可少的。 在使用工业制氧机时&#xff0c;我们首先要确保设备放置在通风…

网络聊天室的UDP实现以及数据库

网络聊天室UDP实现 服务器端&#xff1a; 头文件&#xff1a; #include <myhead.h>//定义客户信息结构体 typedef struct magtye {char type; //消息类型char name[100]; //客户姓名char text[1024]; //客户发送聊天信息 }msg_t;//定义结构体存储…

mysql的语法总结2

命令&#xff1a; mysql -u 用户名 -p mysql登录 命令&#xff1a;create database u1 创建数据库u1 查询数据库 使用数据库u1 创建表department 查询表department ALTER TABLE 表名 操作类型&#xff1b; 操作类型可以有以下的操作&#xff1a; 添加列&#x…

ZCC3808 低静态电流、可编程延迟监控电路 替代TPS3808

1 特性 • 上电复位发生器具有可调节延迟时间&#xff1a;1.25ms 至10s • 超低静态电流&#xff1a;2.4μA&#xff08;典型值&#xff09; • 高阈值精度&#xff1a;0.5% 典型值 • 提供适用于标准电压轨的 0.9V 至 5V 固定阈值电压且可调节电压低至 0.4V • 手动复位 …

CubeMX使用教程(2)——点亮LED

在上一章&#xff0c;我们完成了CubeMX的环境配置&#xff0c;这一章我们通过CubeMX来完成点亮LED的工作。 通过LED原理图可知&#xff0c;如果我们要点亮LD1&#xff08;第一个灯&#xff09;&#xff0c;它对应开发板的PC8端口&#xff0c;因此我们应该在CubeMX中将PC8配置为…

【并查集】一种简单而强大高效的数据结构

目录 一、并查集原理 二、并查集实现 三、并查集应用 1. LeetCode并查集相关OJ题 2. 并查集的其他应用及总结 一、并查集原理 并查集&#xff08;Disjoint Set&#xff09;是一种用来管理元素分组和查找元素所属组别的数据结构。它主要支持两种操作&#xff1a;查找&…

公司内部的手机拍照管理办法建议

公司内部的手机拍照管理是一项重要的工作&#xff0c;因为它涉及到公司的信息安全、知识产权保护和隐私保护等方面。以下是一些建议的公司内部手机拍照管理办法&#xff1a; 明确拍照目的和范围&#xff1a;首先&#xff0c;公司应明确员工使用手机拍照的目的和范围。例如&…

JavaScript进阶 (1)

封装 构造函数存在问题 js可以通过构造函数进行封装&#xff0c;但存在浪费内存问题 每创建新的对象引用数据类型就开辟新的空间 原型 构造函数通过原型分配函数是所有对象所共享的 每一个构造函数都有一个prototype属性&#xff0c;指向另一个对象&#xff0c;也称为原型…

小型内衣裤洗衣机哪个牌子好?四款高热度内衣洗衣机力荐

相信很多用户从小就有个观念&#xff0c;内衣裤不能跟其他衣物一起混合洗&#xff0c;否则会感染细菌&#xff0c;所以不少人的内衣裤一直都是自己手洗的&#xff0c;清洗内衣裤不算麻烦&#xff0c;但日常都要换洗&#xff0c;对一个白天上班已经很累的人来说&#xff0c;真是…

COM(Component Object Model)通信技术

COM&#xff08;Component Object Model&#xff09;通信技术是一种用于组件之间通信的二进制接口标准&#xff0c;它允许在不同进程或计算机上的组件进行交互。以下是 COM 通信技术的一些基本原理&#xff1a; 1. 二进制接口&#xff08;Binary Interface&#xff09;&#x…

如何 借助 AI + bat,1分钟内建立100个自定义文件和文件夹?

01 你好&#xff0c;我是云桃桃。 最近&#xff0c;我在写web系列的知识&#xff0c;做的过程中遇到过不少问题。今天&#xff0c;就来说说&#xff0c;我解决的一个批量新建文件/文件夹的问题。 事情是这样的。首先&#xff0c;我的大纲基本在幕布里已经弄好了&#xff0c;…

简析内部审计数字化转型的方法和路径【小落送书(第6期)】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

mysqld_exporter安装

1.介绍 主要监控Mysql数据库的稳定性、吞吐量、连接情况、缓冲池使用情况、查询性能等各项指标&#xff0c;是我们压测时常常需要监控的一些指标。2.安装 官方网站下载安装包&#xff0c;区分操作系统3.步骤 &#xff08;1&#xff09;直接解压 &#xff08;2&#xff09;在当…

基于ACM32 MCU的电动滑板车方案介绍

随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成为电…

玩转AI大模型应用开发,轻松打造热门APPai数字人直播软件!

AI大模型应用在数字人直播领域的应用愈发成熟&#xff0c;为开发者提供了更多创意和可能性。数字人直播软件是当前热门的应用之一&#xff0c;它结合了虚拟主播和人工智能技术&#xff0c;为用户带来全新的互动体验。想要打造一个火爆的数字人直播软件&#xff0c;就需要玩转AI…

从0到1快速搭建一个jeecg 企业级应用管理后台

一. 基本介绍 官网地址&#xff1a;https://jeecg.com/ JeecgBoot 是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的…

vue 使用谷歌地图 @googlemaps/js-api-loader 进行模糊搜索

<template><div class"map"><div class"mapLeftStyle"><el-inputv-model"input"placeholder"请输入内容"class"controls"input"chnageinput"><i slot"prefix" class"e…

JavaWeb-MyBatis(上)

学完项目管理工具Maven后&#xff0c;继续学习MyBatis。我们都知道&#xff0c;JDBC是一个与数据库连接相关的API&#xff0c;最开始学习数据库连接都是从JDBC开始学起&#xff0c;但是其也有缺点&#xff0c;比如硬编码和操作繁琐等等。而今天学习的MyBatis就是专门为简化JDBC…

【Node.js从基础到高级运用】三、JavaScript基础

Node.js入门&#xff1a;JavaScript基础 在成功搭建了Node.js的开发环境之后&#xff0c;我们即将进入Node.js编程的核心——JavaScript语言本身。在这篇文章中&#xff0c;我们将回顾JavaScript的基础知识&#xff0c;这些是每个Node.js开发者都必须掌握的概念。我们还将探讨…