pom如何引入非Maven工程的jar包

背景

系统迁移从某个公有云迁移到私有云,因为现在国内大力推行国产化,所以我们这次迁移有两个国产化的东西(这里不包括硬件)。第一个是操作系统采用了欧拉操作系统(华为爸爸出产据说已捐),第二个就是数据库采用了goldendb。

这次记录这个问题主要是因为使用提供的goldendb的驱动连接不上数据库,启动的时候报错。这次我们使用的对方提供的gdb_mysql-connector-java-5.1.46.28.jar这个驱动,而且是一个普通工程打成的jar包。

maven工程打包结构中包含pom文件:

而普通工程打包后,是不存在pom文件的:

问题

这个jar包如何使用,用maven私库管理?直接引用?当作外部jar包加载?这个时候发现自己的储备已经不够用。

分析

因为本地没有goldendb只能使用mysql8做测试,驱动使用gdb_mysql-connector-java-5.1.46.28.jar。

方案一:通过web页面上传jar包到nexus私库中,使用pom依赖引入,失败现象下载的jar是空包;

方案二:使用java -jar -Dload.path,但百度告诉我应该使用java -cp path/to/external.jar -jar yourJarFile.jar;

方案三:使用maven命令将驱动jar包推入nexus私服中;

方案四:在项目中的pom文件中使用如下配置,引入jar包;

方案一

使用管理员账号登录自己或者公司搭建的nexus私服,找到左边upload菜单,选中目标仓库进行上传界面如下(图片为nexus3的界面仅供参考):

*注意: *最后的packaging填上jar

上传是成功的,因为在仓库里是能找到对应的包和内容的(网络图片仅供参考):

但是,下载的时候却是不成功的,因为每次下载下来的依赖包只有6kb:

然而服务器上是975kb:

那就说明普通java工程打jar不能通过这种方式直接上传,可能使用maven命令将驱动jar包推入nexus私服中,只是猜测需要验证,方案一行不通。

方案四

新建一个springboot maven项目,在application中增加数据源的配置:

ini 复制代码
spring:
    datasource:
       username: rrbbd
       password: gfdgdf
       driver-class-name: com.goldendb.jdbc.Driver
       url: jdbc:goldendb:loadbalance://localhost:3306/monster?useCursorFetch=false&useSSL=false&cachePrepStmts=true&prepStmtCacheSqlLimit=20480&prepStmtCacheSize=2000&characterEncoding=utf8&queryTimeoutKillsConnection=true&isConnectionLevel=true&connectTimeout=60000&shadowThreadSwitch=False

使用了大佬提供的maven配置进行测试,在工程resources目录下创建lib目录,通过在pom中增加如下配置来引入jar包:

xml 复制代码
<dependency>
        <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.46</version>
       <scope>system</scope>
       <systemPath>${project.basedir}/src/main/resources/lib/gdb_mysql-connector-java-5.1.46.28.jar</systemPath>
</dependency>

*注意: *这里的groupId、artifactId、version可随便命名

然后根据自己的表创建一个jdbc查询语句,用于测试:

ini 复制代码
Connection con = dataSource.getConnection();
Statement stmt = con.createStatement();
String sql = "select * from t_user;";
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData metaData = rs.getMetaData();
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
log.info("id:{}", id);
log.info("name:{}", name);
}
con.close();

工程的目录结构:

异常报错

第一次在idea中启动报java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.

问题原因

这是mysql 8.0版本才出现的问题,原因是mysql 8.0 默认使用 caching_sha2_password 身份验证机制 ------ 从原来的 mysql_native_password 更改为 caching_sha2_password。所以一般这种报错由于本地的MySQL使用的是最新版8.0版本,而打包的项目使用的则是比较低的版本,可以解释说是版本冲突产生的问题。

解决方法

方案1:安装较低版本的MySQL

方案2:修改身份验证机制:

sql 复制代码
alter user 'root'@'localhost' identified by '你的密码' password expire never;
​
alter user 'root'@'localhost' identified with mysql_native_password by '你的密码'
​
flush privileges;

解决认证问题,在idea中启动能够成功连接数据库并读取数据如下图:

打包使用命令启动发现,任然报找不到驱动:

检查jar包中驱动已经打包进去了:

大佬又花了几分钟搞了个测试,增加了一个springboot maven打包插件的参数,如下:

再次打包使用java -jar也成功连接上了mysql数据库,同时也读出来了数据。

结论

方案二和方案三还没有进行测试后续再补充,总归还是自己对maven不够了解。至于手动上传普通java jar包到nexus无法下载,我猜可能因为下载的机制需要验证groupId、artifactId、version与jar包中的pom文件中的定义一样。也就是手动上传至少需要这个jar包本身就是一个maven工程打的包含有pom文件,但这个猜测也需要验证。

总结

一开始,使用驱动直接在项目中替换,改apollo配置尝试启动。改来改去我总觉得排查问题的干扰因素太多,那为什么不简单一点呢?我们直接写一个demo用jdbc查询一个测试表,将数据展示出来。这样就简单多了,我们关注问题本身,排除其他因素的干扰。读不到驱动,不是包没有引入,就是配置有问题,这样我们可以集中精力去做更多的尝试。如果包也引入了,配置也没问题,那再排查其他问题。我认为这种控制变量因素最小化,可以帮助我们来更快地定位到问题以及解决问题。记录一下问题排查的过程,方便以后自己和别人查阅。如果文章有错误的描述或者需要修正可以留言联系我。

遗留问题

问题虽然解决了,但还遗留两个问题。

问题1:普通工程的jar是否可以使用nexus进行管理?是否使用maven命令叫jar推到私库里方式就可以了呢?这个问题还需要验证。

问题2:是否可以使用启动命令java上-cp来加载外部jar依赖?这种方式是否能是程序读到依赖的驱动也还需要验证。

相关推荐
索荣荣4 分钟前
Maven配置文件(pom.xml)终极指南
java·开发语言
数据知道11 分钟前
PostgreSQL 故障排查:万字详解如何找出数据库中的死锁
数据库·postgresql
代码栈上的思考17 分钟前
SpringBoot 拦截器
java·spring boot·spring
AI_567820 分钟前
阿里云OSS成本优化:生命周期规则+分层存储省70%
运维·数据库·人工智能·ai
送秋三十五21 分钟前
一次大文件处理性能优化实录————Java 优化过程
java·开发语言·性能优化
choke23323 分钟前
软件测试任务测试
服务器·数据库·sqlserver
龙山云仓23 分钟前
MES系统超融合架构
大数据·数据库·人工智能·sql·机器学习·架构·全文检索
雨中飘荡的记忆24 分钟前
千万级数据秒级对账!银行日终批处理对账系统从理论到实战
java
IT邦德24 分钟前
OEL9.7 安装 Oracle 26ai RAC
数据库·oracle
jbtianci29 分钟前
Spring Boot管理用户数据
java·spring boot·后端